6

16 GB のファイルを分析する必要があります。fread()と を使用してファイルを順番に読み込んでいますfseek()。それは実現可能ですか?fread()このような大きなファイルでも機能しますか?

4

5 に答える 5

6

返信ありがとうございます。私はどこが間違っているのかを理解しました。4GBを超えるファイルでは機能しませんfseek()ftell()使用_fseeki64()_ftelli64()ましたが、現在は正常に動作しています。

于 2010-09-29T23:00:14.640 に答える
6

言語について言及していないので、C と仮定します。

に問題はありませんfreadが、問題がある可能性がfseekありftellます。

これらの関数は、やlong intのようなインテリジェントなものではなく、ファイルの位置を保持するためのデータ型として使用します。これは、2 GB を超えるファイルでは失敗する可能性があり、16 GB のファイルでは確実に失敗する可能性があることを意味します。fpos_tsize_t

プラットフォームでどれだけ大きいかを確認する必要がありlong intます。64ビットなら大丈夫です。32 の場合、 を使用ftellしてファイルの先頭からの距離を測定するときに問題が発生する可能性があります。

代わりに fgetposandを使用することを検討してください。fsetpos

于 2010-09-29T21:35:56.697 に答える
3

正しく実装されていれば、これは問題になりません。順次とは、ファイルを個別のチャンクで見て、ファイルポインターを進めていることを意味すると思います。

http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.htmlをご覧ください

彼はあなたとほぼ同じことをしていたようです。

于 2010-09-29T21:23:13.007 に答える
2

POSIX っぽいシステムを使用している場合は、プログラムが 64 ビット ファイル オフセットをサポートするようにビルドされていることを確認する必要があります。off_tPOSIX では、実行されるIO のみがシークなしのシーケンシャルであっても、サイズが に収まらないファイルに対する IO 操作を拒否する実装を義務付けています (または、少なくとも許可し、ほとんどのシステムでこれを強制しています) 。

-D_FILE_OFFSET_BITS=64Linux では、これはgccコマンド ラインで使用する必要があることを意味します。

于 2010-09-29T22:56:34.677 に答える
2

それはあなたが何をしたいかによります。メモリ内の 16 GB のデータ全体を読み取る場合、メモリまたはアプリケーション ヒープ領域が不足する可能性があります。

むしろ、データ チャンクをチャンクごとに読み取り、それらのチャンクで処理を行います (完了したらリソースを解放します)。

ただし、これらすべてに加えて、実行するアプローチを決定し (fread()またはistreamなどを使用)、いくつかのテスト ケースを実行して、どちらが適切に機能するかを確認します。

于 2010-09-29T21:19:54.350 に答える