我有一个项目,我必须存储 16 个对象,每个对象都包含一个 185 000 的列表double
。保存对象的总大小应该在 20-30 mb ( sizeof(double) * 16 * 185 000
) 左右,但是当我尝试从数据库中检索它时,数据库会分配 200 mb 来检索这个 20-30 mb 的对象。
我的问题是:
- 这是预期的行为吗?
- 当我只想检索一个文档时,如何避免如此巨大的内存分配?
这是探查器的完全可复制的示例和屏幕截图:
class Program
{
private static string _path;
static void Main(string[] args)
{
_path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "testDb");
// Comment after first insert to avoid adding the same object.
AddData();
var data = GetData();
Console.ReadLine();
}
public static void AddData()
{
var items = new List<Item>();
for (var index = 0; index < 16; index++)
{
var item = new Item {Values = Enumerable.Range(0, 185_000).Select(v => (double) v).ToList()};
items.Add(item);
}
var testData = new TestClass { Name = "Test1", Items = items.ToList() };
using (var db = new LiteDatabase(_path))
{
var collection = db.GetCollection<TestClass>();
collection.Insert(testData);
}
}
public static TestClass GetData()
{
using (var db = new LiteDatabase(_path))
{
var collection = db.GetCollection<TestClass>();
// This line causes huge memory allocation and wakes up garbage collector many many times.
return collection.FindOne(Query.EQ(nameof(TestClass.Name), "Test1"));
}
}
}
public class TestClass
{
public int Id { get; set; }
public string Name { get; set; }
public IList<Item> Items { get; set; }
}
public class Item
{
public IList<double> Values { get; set; }
}
更改185_000
为1_850_000
使我的 RAM 使用量达到 >4GB(!)