1

C#.Netを使用してアクセスする必要のあるテキストファイル(レコード)がいくつかあります。しかし、問題はそれらのファイルが1GBより大きいということです。(最小サイズは1 GBです)

私は何をする必要がありますか?私が集中する必要がある要因は何ですか?

誰かが私にこの状況から乗り越えるためのアイデアを与えることができますか?

編集:

迅速な対応に感謝します。はい、それらは固定長のレコードです。これらのテキストファイルは地元の会社からのものです。(先月の取引記録があります)

通常のテキストファイルのように(通常のファイルストリームを使用して)これらのファイルにアクセスすることは可能ですか?

メモリ管理はどうですか????

4

5 に答える 5

4

CasperOneの答えを拡張する

簡単に言えば、一度に100GBのファイルを確実にメモリに入れる方法はありません。32ビットマシンでは、アドレス空間が十分ではありません。64ビットマシンには十分なアドレス空間がありますが、実際にファイルをメモリに取り込むのにかかる時間の間に、ユーザーはフラストレーションからプロセスを強制終了します。

秘訣は、ファイルを段階的に処理することです。基本のSystem.IO.Stream()クラスは、可変の(場合によっては無限の)ストリームを個別の量で処理するように設計されています。特定のバイト数だけストリームを進むReadメソッドがいくつかあります。ストリームを分割するには、これらのメソッドを使用する必要があります。

あなたのシナリオは十分に具体的ではないので、私はこれ以上の情報を与えることができません。詳細、レコードのデリメータ、またはファイルのサンプル行を教えてください。

アップデート

それらが固定長のレコードである場合、System.IO.Streamは問題なく機能します。File.Open()を使用して、基になるStreamオブジェクトにアクセスすることもできます。Stream.Readには、ファイルから読み取るバイト数を要求するオーバーロードがあります。それらは固定長のレコードであるため、これはシナリオに適しています。

ReadAllText()を呼び出さず、代わりに明示的なバイト配列を受け取るStream.Read()メソッドを使用する限り、メモリは問題になりません。基礎となるStreamクラスは、ファイル全体をメモリに入れないように注意します(もちろん、要求しない限り、:))。

于 2009-01-15T16:04:21.057 に答える
2

克服する必要のある問題を具体的にリストしているわけではありません。ファイルは100GBにすることができ、問題なく処理できます。

ファイル全体を処理する必要がある場合は、クリエイティブなコーディングが必要になりますが、ファイルのセクションを一度に処理できる場合は、ファイル内の必要な場所に比較的簡単に移動できます。から始めて、処理する必要のあるデータをチャンクで処理してから、ファイルを閉じます。

ここでの詳細情報は確かに役立ちます。

于 2009-01-15T15:58:04.160 に答える
0

あなたが現在抱えている主な問題は何ですか?覚えておくべき重要なことは、ストリームの観点から考えることです。つまり、可能な限り最小限のデータをメモリに保持します。LINQは、シーケンスの操作に優れています(ただし、OrderByなど、回避する必要のあるバッファリング操作がいくつかあります)。

たとえば、大きなファイルの単純なレコードを効率的に処理する方法を次に示します(イテレータブロックに注意してください)。

ファイルからの大きなデータに対して複数の集計/分析を実行するには、MiscUtilでLINQをプッシュすることを検討してください。

あなたが考えている問題にもっと文脈を加えることができますか?

于 2009-01-15T16:02:57.613 に答える
0

JaredPar の回答を拡張します。

ファイルがバイナリ ファイル (つまり、4 バイトとして格納された int、固定長の文字列など) の場合は、BinaryReader クラスを使用できます。n バイトを引き出して、それを調べようとするよりも簡単です。

また、System.IO.Stream の読み取りメソッドは非ブロッキング操作であることに注意してください。100 バイトを要求すると、それよりも少ない値が返されることがありますが、まだファイルの終わりには達していません。

BinaryReader.ReadBytes メソッドは、要求されたバイト数またはファイルの終わり (いずれか早い方) を読み取るまでブロックされます。

素敵なコラボレーションの若者たち:)

于 2009-01-15T16:38:04.437 に答える
0

こんにちは、この投稿はしばらく触れられていませんでしたが、問題の解決策があるサイトを投稿したかっただけです。

http://thedeveloperpage.wordpress.com/c-articles/using-file-streams-to-write-any-size-file-introduction/

それが役に立てば幸い!

-CJ

于 2009-07-02T09:59:51.267 に答える