2

我想将文本文件中的 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;
    }
}

谢谢

4

1 回答 1

5

Kaveh,

There are a number of issues here.

1) RavenDB models very rarely map to CSV files. If you have a CSV file, you usually have tabular format, and that isn't a good format to port to RavenDB. You can probably get better results by getting good models.

2) You code, without the if (tasks.Count >= NUMBER_OF_CORES), will generate as many tasks as possible (subject to the limit of reading lines from the file, which is really fast. This will tend to generate thousands of concurrent tasks, and will overload the number of requests RavenDB can insert at once.

3) 使用标准会话,使用 1,024 - 2,048 的批量大小。让它运行。RavenDB 在优化方面非常出色,我希望您可以轻松地看到每秒数千次插入。

但是,同样,您可能在建模错误。

于 2012-06-25T07:40:35.570 回答