2

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();
           }
      }
}    

したがって、各行は個別のデータコンテキストによってロードされます...メモリの問題は残りません! しかし、確かにそれはタスクを実行するための最良のアプローチではありません。

誰でも何か提案できますか?

4

2 に答える 2

3

オブジェクト追跡をオフにしてみてください:

_dc.ObjectTrackingEnabled = false;
于 2012-08-15T23:40:50.143 に答える
2
  1. すでに機能している場合: アプリケーションのニーズに合ったパフォーマンスでメモリの問題を解決している場合、それは良い解決策です。

  2. それでも結果に満足できない場合は、そのままにしておくことlinq to sqlを検討し、 SqlDataReaderreadonly前方専用raw SQLカーソルで使用して、読み取り操作の効率を最大化することを検討してください。

お役に立てれば。

于 2012-08-15T23:40:56.990 に答える