2016-08-12 7 views
0

深い学習モデルでは、データをバッチで読み込む必要があります。すべてのエポック(すべてのデータに対して完全な反復)ごとに、すべての行を一度渡す必要がありますが、データがランダムな順序でアルゴリズムに供給されることが重要です。私のデータセットは大きすぎて、それを完全にメモリに読み込めません。これは可変長のシーケンスデータです。入力フォーマットは、他のスクリプトが出力するクラスタからのダンプなので変更できます。現在、行ごとにいくつかのメタ情報があり、シーケンスは ';'で分割されます。ランダムなチャンクをテキストファイルから読み取る

私の現在の解決策は、すべての行番号をシャッフルし、4つの部分にチャンクし、ファイルを読み取り、チャンク行番号に一致する行を解析するジェネレータです。何も残らなくなるまでバッチサイズのシーケンスを生成し、次の行番号のチャンクを解析します。それは機能しますが、よりよい解決策があるように感じます。誰がより良いワークフローを持っていますか?これは私が定期的に実行する問題です。問題は、すべてのチャンク、すべてのエポックごとにファイルを完全にスキャンしていることです。私はそれをちょうど4つのチャンクで動作させることができますが、30回のエポックは120倍の大きなファイルを読み込みます。

+2

*「それはデータがランダムに供給されていることが重要ですアルゴリズムへの順序 "*シーケンシャルディスクI/O APIは、このようなクレイジーのために設計されたものではありません。 - "深い学習"について何も知らない人に署名しました –

+0

私は 'set(file_obj)'でファイルのセットを作るでしょう。次に、random要素の正しい数を得るために 'random.sample'を使います。 – zondo

+0

@ zondoはファイル内容全体をメモリにロードしませんか? –

答えて

3

メモリ内の行のインデックスを作成します(ファイルを1回通過する必要がありますが、すべてをメモリに格納する必要はありません)。次に、ランダムに高速に行にアクセスできます。

これは堅牢ではありません

(検証なし/範囲チェックなど)しかし:

import sys 

BUFFER_LEN = 1024 


def findNewLines(s): 
    retval = [] 
    lastPos = 0 
    while True: 
     pos = s.find("\n", lastPos) 
     if pos >= 0: 
     pos += 1 
     retval.append(pos) 
     lastPos = pos 
     else: 
     break 
    return retval 


class RandomAccessFile(object): 
    def __init__(self, fileName): 
     self.fileName = fileName 
     self.startPositions = [0] 
     with open(fileName, "rb") as f: 
     looking = True 
     fileOffset = 0 
     while (looking): 
      bytes = f.read(BUFFER_LEN) 
      if len(bytes) < BUFFER_LEN: 
       looking = False 
      newLines = findNewLines(bytes) 
      for newLine in newLines: 
       self.startPositions.append(fileOffset+newLine) 
      fileOffset += len(bytes) 

    def GetLine(self, index): 
     start, stop = self.startPositions[index],self.startPositions[index+1]-1 
     with open(self.fileName, "rb") as f: 
     f.seek(start) 
     return f.read((stop-start)-1) 



raf = RandomAccessFile('/usr/share/dict/words') 


print raf.GetLine(0) 
print raf.GetLine(10) 
print raf.GetLine(456) 
print raf.GetLine(71015) 

出力は次のようになります。

python indexedFile.py 
A 
Aaronic 
abrim 
flippantness 
関連する問題