web-dev-qa-db-ja.com

巨大なファイルの途中でランダムなセクションを取得するにはどうすればよいですか?

私は約3.5GBの巨大なログファイルを持っており、アプリケーションの実行内容をデバッグするために、たとえば10MBの途中でランダムなセクションをサンプリングしたいと思います。

ヘッドコマンドまたはテールコマンドを使用してファイルの先頭または末尾を取得できますが、ファイルの中央から任意の部分を取得するにはどうすればよいですか? head -n 1.75GB | tail -n 10MBのようなことができると思いますが、それは不器用なようで、1.75GBと10MBの行数を取得するには、ファイルの中点の行番号を決定する必要があります。

3
WilliamKF
$ dd if=big_file.bin skip=1750 ibs=1MB count=10 of=big_file.bin.part

Ddを読んで理解するのに少し時間をかけたいと思うかもしれません。

6
kmkkmk

Use tailを使用できますが、バイトオフセットを指定します。

tail -c +$START_BYTE $file | head -c $LENGTH > newfile

そうすれば、テールは(新しいラインを数えずに)開始点に直接ジャンプでき、ヘッドが正しい長さに一致すると、実行を停止します。

4
user1278519

ランダムな場所を探して、ある程度の行を読み取るための小さなプログラムを作成する必要があります。

Python(1行を読み取りますが、変更できます)の例:

def get_random_line():
    """Return a randomly selected line from a file."""
    import random
    fo = open("/some/file.txt")
    try:
        point = random.randrange(fo.size)
        fo.seek(point)
        c = fo.read(1)
        while c != '\n' and fo.tell() > 0:
            fo.seek(-2, 1)
            c = fo.read(1)
        line = fo.readline().strip()
    finally:
        fo.close()
    return line
1
Keith