text
たとえば、jpg ファイルのバイナリ データを含むいくつかの大きなフィールドを持つテーブルがあるとします。タスクは、ディスク上のデータベースからこれらのファイルを取得することです。というわけで、まずは以下のことをすることにしました。
MyDataContext dc = new MyDataContext();
foreach(ImageTable t in dc.ImageTable.OrderBy(i=>i.Id))
{
using (StreamWriter writer = new StreamWriter(new FileStream(string.Concat(t.Name,".jpg"), FileMode.CreateNew), Encoding.GetEncoding(1251)))
{
writer.Write(t.Data);
writer.Close();
}
}
しかし、テーブルに約 2 万行あるとすぐに、OutOfMemoryException
.
最後に、すべての行を 1 つのデータコンテキストにロードすることを避けるために、次のことを行いました。
MyDataContext dc = new MyDataContext();
foreach(int id in dc.ImageTable.OrderBy(i=>i.Id).Select(i=>i.Id))
{
using (MyDataContext _dc = new MyDataContext())
{
ImageTable t = _dc.ImageTable.FirstOrDefault(i => i.Id == id);
using (StreamWriter writer = new StreamWriter(new FileStream(string.Concat(t.Name,".jpg"), FileMode.CreateNew), Encoding.GetEncoding(1251)))
{
writer.Write(t.Data);
writer.Close();
}
}
}
したがって、各行は個別のデータコンテキストによってロードされます...メモリの問題は残りません! しかし、確かにそれはタスクを実行するための最良のアプローチではありません。
誰でも何か提案できますか?