6

だから私はウィキペディアのダンプファイルで遊んでいます。bzip された XML ファイルです。すべてのファイルをディレクトリに書き込むことはできますが、分析を行う場合は、ディスク上のすべてのファイルを再度読み取る必要があります。これによりランダムアクセスが可能になりますが、遅いです。bzip されたファイル全体を RAM に入れるための RAM があります。

ダンプファイルを問題なくロードしてすべての行を読み取ることができますが、巨大なのでシークできません。どうやら、bz2 ライブラリは、そこに移動する前にオフセットを読み取ってキャプチャする必要があります (オフセットは解凍されたバイト単位であるため、すべてを解凍します)。

とにかく、ダンプファイル(〜9.5ギガバイト)をmmapしてbzipにロードしようとしています。以前に bzip ファイルでこれをテストしたいのは明らかです。

mmap ファイルを BZ2File にマップしてシークできるようにしたい (圧縮されていない特定のバイト オフセットを取得するため) のですが、mmap ファイル全体を解凍しないと不可能なようです (これは 30 をはるかに超えます)。ギガバイト)。

オプションはありますか?

テスト用に書いたコードを次に示します。

import bz2
import mmap

lines = '''This is my first line
This is the second
And the third
'''

with open("bz2TestFile", "wb") as f:
    f.write(bz2.compress(lines))

with open("bz2TestFile", "rb") as f:
    mapped = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)

    print "Part of MMAPPED"
    # This does not work until I hit a minimum length
    # due to (I believe) the checksums in the bz2 algorithm
    #
    for x in range(len(mapped)+2):
        line = mapped[0:x]
        try:
            print x
            print bz2.decompress(line)
        except:
            pass

# I can decompress the entire mmapped file
print ":entire mmap file:"
print bz2.decompress(mapped)

# I can create a bz2File object from the file path
# Is there a way to map the mmap object to this function?
print ":BZ2 File readline:"
bzF = bz2.BZ2File("bz2TestFile")

# Seek to specific offset
bzF.seek(22)
# Read the data
print bzF.readline()

シーク後に行を読み取ることができる bz2 ファイル オブジェクトの特別な点は何ですか? アルゴリズムからチェックサムを取得して正しく機能させるには、その前のすべての行を読み取る必要がありますか?

4

1 に答える 1

2

答えが見つかりました!James Taylor は、BZ2 ファイルをシークするためのいくつかのスクリプトを作成しました。彼のスクリプトは、biopython モジュールにあります。

https://bitbucket.org/james_taylor/bx-python/overview

これらは非常にうまく機能しますが、BZ2 ファイル内の任意のバイト オフセットをシークすることはできませんが、彼のスクリプトは BZ2 データのブロックを読み取り、ブロックに基づいてシークすることができます。

特に、bx-python / wiki / IO / SeekingInBzip2Filesを参照してください。

于 2012-10-01T08:27:34.703 に答える