2016-11-17 9 views
5

私は高速データ取得を行うプログラムを書いています。アクイジションカードは6.8GB/s(PCIe3 x8)です。今私はPythonで達成できる最大書き込み速度を見るためにRAMディスクにストリームしようとしています。Pythonで最大の書き込み速度を達成する方法は?

カードは私に私は、どこかの書き込みに5-10個のMBのブロックを、与えるために起こっています。

私は、バイナリファイルに10メガバイトのブロック500回を書き込む、コードのこの作品を書きました。私はWindows 7 64ビット版でAnaconda2を使用していますが、アナコンダの加速器のプロファイラを使用しました。

block = 'A'*10*1024*1024 
filename = "R:\\test" 
f = os.open(filename, os.O_CREAT| os.O_BINARY|os.O_TRUNC|os.O_WRONLY|os.O_SEQUENTIAL) 

p = profiler.Profile(signatures=False) 
p.enable() 
start = time.clock() 
for x in range(500): 
    os.write(f,block) 
transferTime_sec = time.clock() - start 
p.disable() 
p.print_stats() 

print('\nwrote %f MB' % (os.stat(filename).st_size/(1024*1024))) 

私はRAMディスク(R:\)にこれをテストし、私は次の出力ました:だから私は、私が何かの周りに2.5ギガバイトを取得しています/のS考え出し

enter image description here

をRAM。これは悪くないが最大RAMスループットからはまだ遠いが、数字は一貫している。低スループットは1つの問題です。

第二の問題は、私は(I 1090 MB/sのシーケンシャルライトで他のソフトウェアとベンチマークた)のPCIe SSDを用いてこのコードをテストする場合には、それは同等の数値を与えます。

enter image description here

これは私はそれがキャッシングおよび/またはバッファリング(?)ので、私は実際のIOを測定していないよだと思います。私がかなり新しいPythonを使っているから、実際に何が起こっているのか分かりません。

だから私の主な質問は、最大書き込み速度を実現する方法である、とサイドの質問は、なぜ私は、これらの番号を取得していますか?

+0

あなたは 'os.open()')( 'ではなく'オープンを使用し、なぜ私は、疑問に思います? –

+0

男性はプロセスが書き込みを傍受していないことを確認しています。はい、私はあなたにWindows Defenderを見ています。 –

+0

@ShadyAtefファイル属性をより詳細に制御できる可能性があります。直接入力IO –

答えて

0

あなたはまだこの問題の世話をしているかどうかは知りませんが、私はあなたの質問が面白い見つけるので、私はそれをLinuxラップトップ上の試しを与えました。

私は、Python 3.5で、あなたのコードを実行し、あなたが(すべてのデータがディスクに書き込まれている前に、基本的にos.write関数は戻りません)のバッファリングの問題を回避するためにもos.O_SYNC旗を持っている必要があることがわかりました。私はtime.clock()time.time()に置き換えて、よりよい結果を得ました。また

import os 
import time 
import cProfile 

def ioTest(): 
    block = bytes('A'*10*1024*1024, 'utf-8') 
    filename = 'test.bin' 
    f = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | 
       os.O_SYNC) 
    start = time.time() 
    for x in range(500): 
     os.write(f,block) 
    os.close(f) 
    transferTime_sec = time.time() - start 
    msg = 'Wrote {:0f}MB in {:0.03f}s' 
    print(msg.format(os.stat(filename).st_size/1024/1024, 
        transferTime_sec)) 
cProfile.run('ioTest()') 

、DMAを使用し、ボトルネックを回避しますos.O_DIRECTフラグを使用して、およそこのpost話。

import os 
import time 
import cProfile 
import mmap 

def ioTest(): 
    m = mmap.mmap(-1, 10*1024*1024) 
    block = bytes('A'*10*1024*1024, 'utf-8') 
    m.write(block) filename = 'test.bin' 
    f = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | 
       os.O_SYNC, os.O_DIRECT) 
    start = time.time() 
    for x in range(500): 
     os.write(f,m) 
    os.close(f) 
    transferTime_sec = time.time() - start 
    msg = 'Wrote {:0f}MB in {:0.03f}s.' 
    print(msg.format(os.stat(filename).st_size/1024/1024, 
        transferTime_sec)) 
cProfile.run('ioTest()') 

これは、マシンの書き込み時間を40%短縮しました。悪くありません。 os.O_SEQUENTIALと​​は私のマシンで利用できませんでした。

[編集]:この文書のos.O_DIRECTフラグをどのように使用するかがわかりました。これは非常によく綿密に説明しています。site PythonでパフォーマンスとIOを面白くしている人なら、これを読むことを強くお勧めします。

関連する問題