2016-07-01 22 views
0

Pythonソケットプログラミングに関する質問があります。私はかなりソケットの新しいと、おそらくちょうど彼らがどのように動作するのかをよく理解していない。私は、Pythonアプリケーションを実行している間に2つのマシン間でバイナリファイルを転送する必要があり、いくつかのソケットプログラミングを行うことは、システムコマンドscpまたはnetcatを実行するよりも速く/速くなると考えました。しかし何らかの理由で、私のマシン間で1GBイメージを転送すると14秒かかります。もし私がSCP経由でそれをしたら、それは約9時間しかかかりません。SCPは悪く遅いので、これは奇妙に思えます。転送速度がnetcatに匹敵することを望んでいましたが、これを達成するのに問題があります。遅いPythonソケット転送

サーバー:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((socket.gethostname(), 50000)) 
s.listen(1) 

img = open('test.img', 'rb') 

client, addr = s.accept() 
l = img.read(4096) 

while(l): 
     client.send(l) 
     l = img.read(4096) 

img.close() 
s.close() 

クライアント:

host = '' 
port = 50000 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 

img = open('./newimg.img', 'wb') 

l = s.recv(4096) 

while(l): 
    img.write(l) 
    l = s.recv(4096) 

img.close() 
s.close() 

これは明らかに、非常に基本的で、機能や例外処理の多くを欠いているが、それは、少なくとも(ゆっくりけれども)を転送するファイルを取得します。私は明らかに 'ホスト'変数のような私のコードからいくつかの詳細を削除しました。

これを改善するにはどうすればよいですか?

ありがとうございます!

+0

時間でより多くのバイトがTCP_NODELAYを設定してみ受けるようs.recvのバッファサイズ()拡大してください。 send/recvで問題が発生した場合は、少し助けてください。 – Arnial

答えて

0

バッファのサイズを4096から大きなサイズに増やすことをお勧めします。これにより、アイテムがスタック操作やPythonの解釈の回数を減らす回数が減り、データの転送速度が向上する可能性があります。

現在、4096(4K)バイトの読み込みでは、1ギガバイトのファイルに対して262144の読み書きをソケットから行います。バッファを1048576バイト(1024K)に増やすことができれば、1ギガバイトのファイルに対してソケットとファイルからの読み書きは1024回しかありません。これにより、システムコールの最適化されたコードがより多くの努力をするようになります。私はどのくらいのRAMメモリが利用可能かもしれないか分からないので、可能な限り大きなものにするのに役立つかもしれないが、いくらかの余裕のためにいくらかのメモリを自由に残す。

たとえば、私が協力していたシステムでは、少量のデータを送信して、期待したパフォーマンスを得ることができませんでした。少量のデータを1つの大きなメッセージにまとめ、必要なパフォーマンスを得ることができました。最高の状態から、少量のスタックを行き来するシステム機能を呼び出す時間のログを費やしていたと判断できました。

しかし、コンパイルされたマシンコードであるため、scpはまだ高速である可能性があり、追加のオーバーヘッドがあっても解釈を行わない可能性があります。

0

それは