データベースからフェッチするときに、アプリケーションでOutOfMemory例外が発生します。これは、Linq2Sqlを使用するC#.Netアプリケーションです。
GC.GetTotalMemory()
データベースの呼び出しの前後にどのくらいのメモリが使用されているかを確認するためにを使用してみました。これにより、何が起こっているのかを正確に把握することはできませんが、わかりやすくなります。Windowsタスクマネージャーを見ると、次のコードを使用してページ形式でデータをフェッチすると、ピークワーキングセットが小さくならないことがわかります。
public static void PreloadPaged()
{
int NoPoints = PointRepository.Count();
int pagesize = 50000;
int fetchedRows = 0;
while (fetchedRows < NoPoints)
{
PreloadPointEntity.Points.AddRange(PointRepository.ReadPaged(pagesize, fetchedRows));
PointRepository.ReadPointCollections();
PreloadPointEntity.PointCollections.Count());
fetchedRows += pagesize;
}
}
private static List<PointEntity> ReadPaged(int pagesize, int fetchedRows)
{
DataModel dataContext = InstantiateDataModel();
var Points = (from p in dataContext.PointDatas
select p.ToEntity());
return Points.Skip(fetchedRows).Take(pagesize).ToList();
}
メモリを使い果たして、後で再利用したり解放したりしていないのはLinq2Sqlコードだと思いますが、メモリフットプリントを減らすにはどうすればよいですか?
私は、データをフェッチするために、エンティティのリストにデータを格納する場合の10倍のメモリを使用することを確認しました。ガベージコレクターを呼び出すことを検討しましたが、むしろ避けたいと思います。