2016-08-22 3 views
1

データをh5pyデータセットに書き込もうとしていますが、高メモリ12コアのGCEインスタンスを使用してSSDディスクに書き込みます13時間、目の前に終わりがない。 私はSSDのディスク上に格納されたファイルにh5pyデータセットに追加する前に(第二非SSDディスクに格納されている)小さな多数のファイルをunpickle化するGCEインスタンス上Jupyterノートブックを実行しているSSDディスクのh5pyにデータを書き込むのが遅い:速度を上げるためにできること

  • 最大形状= (29914, 251328)
  • チャンク=
  • (59, 982)
  • 圧縮= gzip
  • DTYPE = float64

私のコードは、ディスク上のh5pyファイルは、私が上記および下記のコードを使用して移入各データセットを1.4ギガバイトを増やしているようだ

#Get a sample 
minsample = 13300 
sampleWithOutReplacement = random.sample(ListOfPickles,minsample) 

print(h5pyfile) 
with h5py.File(h5pyfile, 'r+') as hf: 
    GroupToStore = hf.get('group') 
    DatasetToStore = GroupToStore.get('ds1') 
    #Unpickle the contents and add in th h5py file     
    for idx,files in enumerate(sampleWithOutReplacement): 
     #Sample the minimum number of examples 
     time FilePath = os.path.join(SourceOfPickles,files) 
     #Use this method to auto close the file 
     with open(FilePath,"rb") as f: 
      %time DatasetToStore[idx:] = pickle.load(f) 
      #print("Processing file ",idx) 

print("File Closed") 

の下にリストされていることh5pyファイル

group.create_dataset(labels, dtype='float64',shape= (maxSize, 251328),maxshape=(maxSize,251328),compression="gzip") 

でデータセットを作成するために私のコードですh5pyファイルを作成するのに必要な時間を短縮するために、私の設定や自分のコード、あるいはその両方にどのような改善を加えることができますか?

アップデート1 は私が8時間

CPU times: user 0 ns, sys: 0 ns, total: 0 ns 
Wall time: 14.1 µs 
CPU times: user 8h 4min 11s, sys: 1min 18s, total: 8h 5min 30s 
Wall time: 8h 5min 29s  

答えて

1
を取ると報告されたデータストアへのロードを高速化上の任意のアドバイスを歓迎するだろう、時間にプロセスをjupyterのノートブックにはいくつかの魔法を追加しました

これは非常に間違っているようだ:DatasetToStore [IDX:]

あなたはおそらくしたい:DatasetToStore [IDX、...]

私は思いますあなたのバージョンはidxの後のすべての行をすべての反復でunpickledデータセットで上書きします。このバージョンでは、各繰り返しでデータセットに1行だけ上書きされます。

1
  1. JRooseが正しいと思われるコードが間違っているようです。

  2. デフォルトでは、h5pyは1MBのチャンクキャッシュしか使用しませんが、これは問題には不十分です。 低レベルAPIでキャッシュ設定を変更したり、代わりにh5py_cacheを使用したりすることができます。 https://pypi.python.org/pypi/h5py-cache/1.0

    変更500メガバイトに例えばチャンクキャッシュを増やす

    with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=500*1024**2) as hf 
    

    にライン

    with h5py.File(h5pyfile, 'r+') as hf 
    

  3. 私はの結果を1D配列と仮定します。データセットは2Dです。あなたは

    %time DatasetToStore[idx,:] = pickle.load(f) 
    

    を書くとき は、この場合は何の問題もありませんが、私の調査結果にはかなり遅くなります。速度を上げるには、データをデータセットに渡す前に2D配列を作成します。

    %time DatasetToStore[idx:idx+1,:] = np.expand_dims(pickle.load(f), axis=0) 
    

    なぜこれが速いのか分かりませんが、私のスクリプトでは、このバージョンは上記のバージョンより約20倍高速です。 HDF5ファイルから読み込む場合も同じです。

関連する問題