2017-06-19 6 views
0

30 MBの文字サイズの大きなファイルを読み込もうとしています。私は大きなファイルを読む方法に関する興味深い記事を見つけました。 Fast Method to Stream Big filesPythonのmmapで、テキストの代わりにバイナリデータを出力する

問題:代わりに、実際の人間が読めるテキストのバイナリデータを印刷出力

コード:

def getRow(filepath): 
    offsets = get_offsets(filepath) 
    random.shuffle(offsets) 
    with gzip.open(filepath, "r+b") as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for position in offsets: 
      mm.seek(position) 
      record = mm.readline() 
      x = record.split(",") 
      yield x 


def get_offsets(input_filename): 
    offsets = [] 
    with open(input_filename, 'r+b') as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for record in iter(mm.readline, ''): 
      loc = mm.tell() 
      offsets.append(loc) 
      i += 1 
    return offsets 

for line in getRow("hello.dat.gz"): 
    print line 

出力:出力は、いくつかの奇妙なバイナリデータを生成しています。

['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\ 

私は恐ろしい何かをしていますか?

EDIT:

私は問題を発見しました。それはgzip.openのためです。これを取り除く方法はわかりません。何か案は? GZipFileの文書を1として

答えて

1

fileno(self)

Invoke the underlying file object's `fileno()` method. 

あなたは圧縮.gzファイルではなく、圧縮されたデータのビューのビューをマッピングしています。

mmap()は、OSファイルハンドルでしか動作できません。任意のPythonファイルオブジェクトをマップすることはできません。

いいえ、圧縮されたファイルの圧縮解除されたビューは、基になるオペレーティングシステムによって直接サポートされていない限り、透過的にマップすることはできません。

+0

入力いただきありがとうございます。私はそれに応じて私のメソッドを変更しようとしています。 – vkrams

関連する問題