2012-01-17 10 views
2

データを転送するために、マシンとリモートホスト間にSSL対応ソケットを作成するためのコードが以下のようにあります。 sock.sendの各呼び出しで送信されるデータの量は約16Kです。これを設定する方法はありますか? 16Kのチャンクで10MBのデータを送信するのは非常に遅いですが、チャンクのサイズを約1〜2MBに設定できますか?1つのsocket.send()呼び出しで送信されるデータ量の増加

from OpenSSL import SSL 
import socket 

''' Create SSL context. 
ctx = ... 

''' Create SSL enabled socket. 
sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM)) 

''' Connect to the remote host. 
sock.connect((host_address, port)) 

''' msg is a large string about 10 MB. 
msg = ... 

''' Send data over the socket. 
total_sent = 0 
while (total_sent < len(msg)): 
    sent = sock.send(msg[total_sent:]) 
    total_sent += sent 
+0

1行のコメントに '#'を使用してください。 '' '' 'を使用すると、コードを非常に読みにくくすることができます。また、コードでプロファイラを実行してください。おそらく 'msg [total_sent:]'はおそらくこのループの最も高価な部分であることがわかります。 –

答えて

1

ブロックサイズを16Kから1〜2MBに増やすことは、パフォーマンスにほとんど影響しません。 TCP/IP接続のスループットがボトルネックになる可能性があります(イーサネットネットワークのMTUはおそらく1500バイトまたは9000バイトです。したがって、すべてがそのサイズの断片に細分化されます)。

+0

2台のマシン間で10MBのファイルをscpすると、ファイルの転送に10秒以下かかります。上記のコードを使用してファイルを転送しようとすると、時間がかかります。 scpはどのようにしてデータをより高速に転送できますか? – user1154735

+0

@ user1154735:10MBの文字列で 'msg [total_sent:]'を繰り返し呼び出していると思われるものがあります。 'msg [total_sent:total_send + 16 * 1024]'に変更して、もう一度やり直せますか? – NPE

+0

@aix:それほど助けにならないでしょう。古い文字列からの新しい文字列の作成は、キラーになるでしょう。ここでのトリックは、新しい文字列をすべて作成することを避けることです。私はこれがhttp://docs.python.org/library/functions.html#bufferの適切な場所だと思います。 –

3

sendメソッドは、すべてのバイトを送信することを保証しませんが、メソッドは行いません。それは文字列のスライスを避けるでしょう。

関連する問題