1

私の仕事は、C# コンソール アプリの形式で、非常に大きな (50 GB 以上) ASCII テキスト ファイル (n 行目/n 行目の n 番目の単語の要求を処理する) へのランダム読み取りアクセスを提供することです。

グーグルで数日間読んだ後、実装のビジョンにたどり着きましList<List<long>>map[i][j]行が始まります)。次に、インデックスを使用してMemoryMappedFileを介してファイルにアクセスします。これは、ランダム アクセスを提供するのに適しているためです。

ソリューションに明らかな欠陥はありますか? 特定のタスクに最適でしょうか?

UPD : 64 ビット システムで実行されます。

4

2 に答える 2

5

問題ないように思えますが、MemoryMapping を使用している場合、使用可能な有効な 2GB アドレス空間を超えているため、プログラムは 64 ビット システムでのみ動作します。

FileStreama を使用して、必要に応じて選択したオフセットにジャンプするように呼び出すだけで.Seek()問題ないため、MemoryMapped ファイルを使用する必要はないと思います。

于 2013-03-14T21:20:38.777 に答える
2

あなたのソリューションは良いスタートだと思います.Listコンテナは最高のMapコンテナではありません.Listは任意の要素を読むのが非常に遅いです.

メモリ/速度のトレードオフの観点からマップを実行することが最適かどうかをテストList<List<long>>します.OSはページ境界(x86/x64では4096バイト)でメモリマップをキャッシュするため、実際にはそれぞれの開始アドレスのみを検索する方が速い場合があります行をスキャンし、単語を探して行をスキャンします。

明らかに、このアプローチは 64 ビット OS でのみ機能しますが、MMap のパフォーマンス上の利点は重要です。これは、64 ビットへの移行が重要な数少ない場所の 1 つです。データベース アプリケーションです :)

于 2013-03-14T21:22:32.790 に答える