0

私が達成する必要があることを説明させてください。ファイルをRAMにロードし、その構造を分析する必要があります。私がしていたことはこれです:

//Stream streamFile;

byte[] bytesFileBuff = new byte[streamFile.Length];
if(streamFile.Read(bytesFileBuff, 0, streamFile.Length) == streamFile.Length)
{
    //Loaded OK, can now analyze 'bytesFileBuff'
    //Go through bytes in 'bytesFileBuff' array from 0 to `streamFile.Length`
}

しかし、 Windowsと32ビットプロセスに関する以前の経験では、RAMの量がさらに少ないと割り当てるのが難しいようです。(その特定の例では、16GBのRAMがインストールされているWindows 7マシンに512MBを割り当てることができませんでした。)

だから私は興味がありました、(ページファイルアーキテクチャの内部アナログを実装することによって)仮想的に任意の長さのファイルのコンテンツを操作できるようにする特別なクラスはありますか?

4

1 に答える 1

2

線形ストリームアクセス(複数のパスがある場合でも)が実行可能なオプションではない場合、Win32の解決策は、ビューが比較的小さいメモリマップトファイルを使用することです。

C#で簡単にできるとは思いませんでしたが、間違っていました。.NET 4.0以降では、メモリマップトファイルAPIをラップするクラスが提供されていることがわかりました。

http://msdn.microsoft.com/en-us/library/dd997372.aspxを参照してください

C / C ++でメモリマップトファイルを使用したことがある場合は、何をすべきかがわかります。

基本的な考え方は、MemoryMappedFileCreateFromFileを使用してMemoryMappedFileオブジェクトを取得することです。オブジェクトを使用して、 CreateViewAccessorメソッドを呼び出して、ファイルのチャンクを表すさまざまなMemoryMappedViewAccessorオブジェクトを取得できます。これらのオブジェクトを使用して、選択したチャンクでファイルから読み取ることができます。MemoryamappedViewAccessorsメモリバッファを解放するために、注意深く処分するようにしてください。

メモリマップトファイルを使用するための適切な戦略を立てる必要があります。あまり多くの小さなビューを作成したくない場合は、多くのオーバーヘッドが発生します。大きなビューが少なすぎると、大量のメモリを消費します。

(私が言ったように、私は.NETのこれらのクラスラッパーについて知りませんでした。MSDNドキュメントを注意深く読んでください:それらをレビューするのに費やした数分で重要な何かを簡単に見逃したかもしれません)

于 2013-03-25T03:13:09.267 に答える