插入RavenDB; 最快的方式

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)

谢谢

Aye*_*ien 5

卡韦赫,

这里有很多问题.

1)RavenDB模型很少映射到CSV文件.如果你有一个CSV文件,你通常有表格格式,这不是一个好的格式来移植到RavenDB.获得好的模型可能会获得更好的结果.

2)你的代码,没有if (tasks.Count >= NUMBER_OF_CORES),将产生尽可能多的任务(受到文件读取行的限制,这是非常快的.这将产生数千个并发任务,并将超载请求数RavenDB可以立即插入.

3)使用标准会话,批量大小为1,024 - 2,048.然后让它运行.RavenDB非常适合优化,我希望你能够轻松地每秒看到数千个插入.

但是,再次,你可能是错误的建模.