.NET でバイナリ ファイルをキャッシュし、キャッシュされたファイルに対して通常のファイル操作を行うことは可能ですか?
5 に答える
これを行う方法は、コンテンツ全体をからオブジェクトに読み込み、FileStream
後でMemoryStream
このオブジェクトをI/Oに使用することです。どちらのタイプもから継承するStream
ため、使用法は実質的に同じになります。
次に例を示します。
private MemoryStream cachedStream;
public void CacheFile(string fileName)
{
cachedStream = new MemoryStream(File.ReadAllBytes(fileName));
}
したがってCacheFile
、指定されたファイルをキャッシュするときにメソッドを1回呼び出すだけで、コード内の他の場所でcachedStream
読み取りに使用できます。(実際のファイルは、その内容がキャッシュされるとすぐに閉じられます。)覚えておくべきことは、ファイルがcachedStream
終了したら破棄することだけです。
最新のOSにはキャッシュシステムが組み込まれているため、実際、ファイルを操作するときは常に、ファイルのメモリ内キャッシュを操作しています。
カスタムキャッシュを適用する前に、重要な質問をする必要があります。基になるファイルが変更され、キャッシュされたコピーが無効になるとどうなりますか?
キャッシュされたコピーの変更が許可されていて、変更を基になるファイルに保存し直す必要がある場合は、問題をさらに複雑にする可能性があります。
ファイルが小さい場合はMemoryStream
、別の回答で提案されているように使用する方が簡単です。
変更をファイルに保存する必要がある場合は、すべてをに転送するラッパークラスを作成できますがMemoryStream
、書き込み操作が実行されるたびにtrueに設定されるIsDirtyプロパティが追加されています。次に、選択するたびに(より大きなトランザクションの最後に?)(IsDirty == true)
起動し、新しいバージョンをチェックしてディスクに保存する管理コードを作成できます。これは「レイジーライト」キャッシングと呼ばれます。これは、変更がメモリに行われ、実際にはしばらくしてから保存されるためです。
byte[]
本当に問題を複雑にしたい場合、またはファイルが非常に大きい場合は、独自のページングを実装して、バッファサイズ(おそらく1 MB?)を選択し、その固定サイズのページを少数保持することができます。今回は、各ページにダーティフラグがあります。Streamメソッドを実装して、呼び出し元から詳細を非表示にし、必要に応じてページバッファーをプル(または破棄)します。
最後に、より簡単な生活が必要な場合は、次のことを試してください。
http://www.microsoft.com/Sqlserver/2005/en/us/compact.aspx
これにより、SQL Serverと同じSQLエンジンをファイルで使用でき、すべてが外部RDBMSサーバー経由ではなくプロセス内で発生します。これにより、ファイルのクエリと更新がはるかに簡単になり、手書きの永続化コードを大量に作成する必要がなくなります。
もちろん、ファイルをbyte []配列に読み込んで、作業を開始することもできます。また、ストリームを使用する場合は、FileStreamをMemoryStreamにコピーして、次のように操作を開始できます。
public static void CopyStream( Stream input, Stream output )
{
var buffer = new byte[32768];
int readBytes;
while( ( readBytes = input.Read( buffer, 0, buffer.Length ) ) > 0 )
{
output.Write( buffer, 0, readBytes );
}
}
パフォーマンスが心配な場合は、通常、さまざまなファイルアクセス方法の組み込みメカニズムで十分です。
あなたが何をしているのか正確にはわかりませんが、私はこの提案を提供します (あなたが何をしているのかによって実行可能である場合とそうでない場合があります):
ファイルの内容だけをキャッシュするのではなく、ファイルの内容を適切に型指定された項目のコレクションに入れてから、それをキャッシュしてみませんか? 解析が含まれていないため、アイテムの検索が少し簡単になり、高速になるでしょう。
Luceneには、ディスクからメモリにバイトをキャッシュし、ストアなどをインテリジェントに更新する非常に洗練されたキャッシング システムがあります。また、Microsoft SQL Server のデータ ストレージ レイヤーについてもお読みになることをお勧めします。MSSQL チームは、より重要な実装の詳細について近日中に発表する予定です。