1

行ごとにではなく、複数のファイルから行を読み取りたい。ファイルがメモリに収まらないため、ディスクから読み取る必要があります。Cで複数のファイルから特定の行を最高のパフォーマンスで読み取るための最良の方法は何ですか?

例:

  • ファイル 4 の 1 行目
  • ファイル 2 の 5 行目
  • ファイル 4 の 5 行目 .......
4

4 に答える 4

2

Linux または Windows を使用している場合は、ファイルのファイル マッピングを作成できます。それはメモリに入れられず、ファイルのバッファへの高速アクセスを提供します。

Linux では、man の「mmap」を確認できます。

Windows では覚えていませんが、Google で検索できます: Windows でのファイル マッピング。

行ごとに読むことについては、fscanf を使用するか、独自の関数を実装することができます。覚えておいてください: Linux では "\n" まで、Windows では "\r\n" まで読んでください。

幸運を!

于 2012-09-01T22:16:10.067 に答える
2

Linux では、おそらく madvise(2 )とおそらく (別のスレッドで) readhahead(2) syscall を使用して、 mmap(2) syscallを使用して数メガバイトのチャンクでファイルを読み取り、メモリ マップできます。

しかし、ボトルネックはおそらくハードウェアです。SSD または非常に高速なディスクの使用を検討してください。

行境界に関心がある場合は、明示的に管理 (およびメモ化) する必要があります。おそらく、改行文字のオフセットを覚えておく必要があります。

于 2012-09-01T22:10:39.203 に答える
1

あなたの問題はファイルを読んでいません。問題は、ファイルのどの部分を読み取るかを知ることです。

このためには、すべての行の開始位置を示すインデックス テーブルを事前に準備する必要があります。

もちろん、怠惰な方法で構築することもできます。その場合、N 行目が必要になります。

于 2012-09-01T22:53:04.240 に答える
0

どのファイル システムを使用しているかはわかりませんが、ファイル用に予約されたメモリ内で改行コードが配置されている場所を自動的に追跡できないことはほぼ確実です。

つまり、特定の行でファイルにすばやくアクセスする方法を得るには、行のインデックスを作成する必要があります。処理しているファイルの既知の妥当性がない場合は、ファイルを少なくとも 1 回完全にスキャンして、そのようなインデックスを構築します。

明らかに、ファイルがシステム RAM よりも大きい場合は、インデックスの構築に必要なスキャンを実行しながら、賢明なメモリ管理を実装する必要があります。

インデックスが作成されたら、読み取りたいメモリの唯一のセクションにアクセスするだけです。

于 2012-09-01T22:40:59.150 に答える