0

これは非常に奇妙です

Pythonのnumpyライブラリを使用していくつかの(確かに非常に大きい:それぞれ最大2GB)バイナリファイルを読んでいます。私は使用しています:

thingy = np.fromfile(fileObject, np.int16, 1)

方法。これはネストされたループの真ん中にあります-私はこのループを「チャネル」ごとに4096回実行し、この「チャネル」ループは「レシーバー」ごとに9回、この「レシーバー」ループは4回実行しています(9チャネルあります)受信機ごとに、そのうちの4つがあります!)。これはすべての「ブロック」に適用され、ファイルごとに最大3600個あります。

ご覧のとおり、非常に反復的で、長い時間がかかることはわかっていますが、予想よりもかなり長くかかっていました。「ブロック」あたり平均8.5秒でした。

time.clock()などを使用していくつかのベンチマークを実行したところ、「ブロック」ごとに約1または2サンプル(つまり、4096 * 9 * 4の1または2)を除いて、すべてが正常に実行されていることがわかりました。数秒間「スタック」します。これは、バイナリから単純なint16を返す場合であり、数秒かかるはずの正確なものではありません...なぜそれが固執するのですか?

ベンチマークから、毎回同じ場所に留まっていることがわかりました(ブロック2、レシーバー8、チャネル3、サンプル1085は、記録のためにそのうちの1つでした!)、ほぼ同じ量の間、そこに留まります。各実行の時間。

何か案は?!

ありがとう、

ダンカン

4

3 に答える 3

3

再現性のあるサンプルがないと言うのは難しいですが、これはバッファリングの問題のように聞こえます。最初の部分はバッファリングされ、バッファの最後に到達するまで高速です。次に、次のバッファがいっぱいになるまで速度が低下します。

于 2010-02-15T12:52:19.570 に答える
2

結果はどこに保存しますか?リスト/ディクテーション/何でも非常に大きくなると、それらを再割り当てしてサイズを変更する必要があるときに、顕著な遅延が発生する可能性があります。

于 2010-02-15T15:00:05.420 に答える
1

ガベージコレクションがリストに登場しているのでしょうか?

追加:それは面白いデータですか、それともblocknoですか?線に沿ってランダムな順序でブロックを読み取るとどうなりますか

r = range(4096)
random.shuffle(r)  # inplace
for blockno in r:
    file.seek( blockno * ... )
    ...
于 2010-02-15T18:03:32.740 に答える