web-dev-qa-db-ja.com

ソフトウェアはどのようにして、可能であると思われるよりも速くネットワークファイルを読み取ることができますか?

これは、パフォーマンスの最適化に関する一般的な概念的な質問です。次の実際のケースに動機づけられています。

100Mbpsの制限があるWindowsネットワークドライブにファイルがあります。これはバイナリファイルで、165MBです。

私のローカルマシンには、このファイル形式を操作するために特別に設計されたソフトウェアが搭載されており、そのソフトウェアで開くと、すべての情報を表示するのに1秒もかかりません。この1秒間にタスクマネージャを監視すると、ソフトウェアのプロセスは次のようになります。

  • 13%ネットワーク(@ 26.4 Mbps短時間)
  • 08%CPU(@ 1.2%短時間)

形式は既知であるため、Pythonスクリプトを解析して解析し、structモジュールを使用しているときにできる最速は約15〜17秒です。この間PythonプロセスのCPU使用率は変化しませんが、ネットワーク使用率は94%に達します(平均82 Mbps)。

ソフトウェアがファイルを完全に高速で読み取ることができるようにするために何ができるでしょうか?それでも私はネットワーク帯域幅を最大化していて、はるかに長くかかりますか?

2
datta

100 Mbps (メガビット/秒)のネットワークは、ペイロードとプロトコルのオーバーヘッドを含めて、1秒あたり12.5 MBを伝送します。 165 MBのファイルには少なくとも13.5秒必要です(実際には少し多く必要です。データは最大64KBの IPパケット にパックする必要があり、それぞれに40バイトのヘッダーが追加されます)。

したがって、アプリケーションが完全なデータを1秒未満で読み取ることができることは厳密に不可能です。

ただし、記述した動作を実現するには、いくつかの可能性があります。

  • ファイル形式が非常に冗長になり、サーバー側で元のサイズの7%にしか圧縮できない場合これはありそうもないことです。
  • アプリが以前にデータを読み取っていた場合(たとえば、前のセッションからキャッシュされたか、バックグラウンドでロードされたか?)
  • アプリがファイルのほんの一部(12.5 MB未満)しか読み取らない場合は、部分的なコンテンツをすぐに画面に表示し、それがどれほど速いかを知りながらコンテンツの読み取りを開始し、ファイルの残りの部分の読み取りを開始します。バックグラウンドで。

最後の仮説は断然最も可能性が高いです。

9
Christophe