我想将文本文件中的 1 亿个条目(每一行是一个类似 csv 的条目)导入 RavenDB 数据库。最快的方法是什么?
补充说明:
我还没有任何索引(我将在插入数据后创建它们)。RavenDB 在本地机器上以服务模式运行,没有增强安全性(但是;因为我仍在测试 RavenDB)。该测试将在 2 台不同的机器上运行,1)2 核 4GB 内存 2)8 核 12 GB 内存。
我已经将部分数据(200 万个条目)插入到 RavenDB 中,但它并没有我想要的那么快。通过使用 OpenAsyncSession 并为每 1024 条记录调用 SaveChangesAsync,并通过调用 OpenAsyncSession 并且在 500`000 个左右条目后不等待返回任务(由 SaveChangesAsync 返回)再次创建一个新会话,我得到一个“索引超出范围”异常,我不能根除。但是,如果我等待任务结束(通过创建与内核数相同的任务),进程将成功但不够快。
此代码运行成功:
using (var reader = new StreamReader(@"D:\*\DATA.TXT", Encoding.UTF8))
{
string line = null;
IAsyncDocumentSession session = null;
var tasks = new List<Task>();
var locCount = 0;
while ((line = reader.ReadLine()) != null)
{
if (string.IsNullOrWhiteSpace(line)) continue;
var loc = Parse(line);
if (session == null) session = documentStore.OpenAsyncSession();
session.Store(loc);
locCount++;
if (locCount % 1024 == 0 && session != null)
{
try
{
var t = session.SaveChangesAsync();
tasks.Add(t);
session = null;
}
catch (Exception x)
{
// ... something ...
}
}
if (tasks.Count >= NUMBER_OF_CORES)
{
Task.WaitAll(tasks.ToArray());
tasks.Clear();
}
}
if (session != null)
{
if (tasks.Count > 0)
{
Task.WaitAll(tasks.ToArray());
tasks.Clear();
}
session.SaveChangesAsync().Wait();
session = null;
}
}
谢谢