16 GB のファイルを分析する必要があります。fread()
と を使用してファイルを順番に読み込んでいますfseek()
。それは実現可能ですか?fread()
このような大きなファイルでも機能しますか?
5 に答える
返信ありがとうございます。私はどこが間違っているのかを理解しました。4GBを超えるファイルでは機能しませんfseek()
。ftell()
使用_fseeki64()
し_ftelli64()
ましたが、現在は正常に動作しています。
言語について言及していないので、C と仮定します。
に問題はありませんfread
が、問題がある可能性がfseek
ありftell
ます。
これらの関数は、やlong int
のようなインテリジェントなものではなく、ファイルの位置を保持するためのデータ型として使用します。これは、2 GB を超えるファイルでは失敗する可能性があり、16 GB のファイルでは確実に失敗する可能性があることを意味します。fpos_t
size_t
プラットフォームでどれだけ大きいかを確認する必要がありlong int
ます。64ビットなら大丈夫です。32 の場合、 を使用ftell
してファイルの先頭からの距離を測定するときに問題が発生する可能性があります。
代わりに fgetpos
andを使用することを検討してください。fsetpos
正しく実装されていれば、これは問題になりません。順次とは、ファイルを個別のチャンクで見て、ファイルポインターを進めていることを意味すると思います。
http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.htmlをご覧ください
彼はあなたとほぼ同じことをしていたようです。
POSIX っぽいシステムを使用している場合は、プログラムが 64 ビット ファイル オフセットをサポートするようにビルドされていることを確認する必要があります。off_t
POSIX では、実行されるIO のみがシークなしのシーケンシャルであっても、サイズが に収まらないファイルに対する IO 操作を拒否する実装を義務付けています (または、少なくとも許可し、ほとんどのシステムでこれを強制しています) 。
-D_FILE_OFFSET_BITS=64
Linux では、これはgcc
コマンド ラインで使用する必要があることを意味します。
それはあなたが何をしたいかによります。メモリ内の 16 GB のデータ全体を読み取る場合、メモリまたはアプリケーション ヒープ領域が不足する可能性があります。
むしろ、データ チャンクをチャンクごとに読み取り、それらのチャンクで処理を行います (完了したらリソースを解放します)。
ただし、これらすべてに加えて、実行するアプローチを決定し (fread()
またはistream
などを使用)、いくつかのテスト ケースを実行して、どちらが適切に機能するかを確認します。