3

私はmmap大きなファイルを開くために遊んでいます。ファイルの最初の行が観測値の数であると想定します。各観測は2行にまたがっています。

Observation ID \n
Variable length number of integers

私はこれらについていくつかの計算を行っており、を使用したいと思いますmultiprocessingseek()バイトオフセットの代わりにラインをシークするために使用することは可能ですか?
明らかに、これはファイルからのメソッドを使用して簡単に実行openできますが、私はで遊んでいるのでmmap、このコンテキストでそれが可能かどうか疑問に思います。

4

1 に答える 1

2

ファイルは行ではなく、バイトのストリームです。ファイル内の特定の行の先頭にランダム アクセスする必要がある場合、ファイル内のどのオフセットでそれが見つかるかを先験的に知る方法はありません。mmap()これは、pread()、 、seek()、またはその他の方法でランダム アクセスを行っているかどうかに関係なく当てはまります。

この問題を解決する唯一の方法は、行番号とバイト オフセットの間のマッピングを作成することです。これは通常、ファイル全体を 1 回順番にスキャンする必要があることを意味します。

特定のニーズに応じて、他のアプローチを適用できる場合があります。たとえば、目標の行数にほぼ到達できれば十分で、ファイル内の行の平均の長さがわかっている場合は、目的の行数に平均の行の長さを掛けたものを探して、見つけた行を使用することができます。その位置で。または、観測 ID がすべて番号順に並んでいる場合は、必要な行が見つかるまで、バイト オフセットを使用してファイルをバイナリ検索できます。

于 2013-02-24T22:48:28.500 に答える