Kav*_*ian 2 c# asynchronous insert nosql ravendb
我想从一个文本文件(每行是一个类似csv的条目)导入1亿个条目到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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
卡韦赫,
这里有很多问题.
1)RavenDB模型很少映射到CSV文件.如果你有一个CSV文件,你通常有表格格式,这不是一个好的格式来移植到RavenDB.获得好的模型可能会获得更好的结果.
2)你的代码,没有if (tasks.Count >= NUMBER_OF_CORES)
,将产生尽可能多的任务(受到文件读取行的限制,这是非常快的.这将产生数千个并发任务,并将超载请求数RavenDB可以立即插入.
3)使用标准会话,批量大小为1,024 - 2,048.然后让它运行.RavenDB非常适合优化,我希望你能够轻松地每秒看到数千个插入.
但是,再次,你可能是错误的建模.
归档时间: |
|
查看次数: |
2233 次 |
最近记录: |