gpt4 book ai didi

c# - 插入 RavenDB;最快的方式

转载 作者:行者123 更新时间:2023-12-02 22:37:48 26 4
gpt4 key购买 nike

我想将 1 亿个条目从文本文件(每一行是一个类似 csv 的条目)导入 RavenDB 数据库。最快的方法是什么?

附加说明:

我还没有任何索引(我将在插入数据后创建它们)。 RavenDB 在本地机器上以服务模式运行,没有任何安全增强功能(但是;因为我仍在测试 RavenDB)。该测试将在 2 台不同的机器上运行,1) 2 核 4GB 内存 2) 8 核 12GB 内存。

我已经将部分数据(200 万个条目)插入到 RavenDB 中,但速度没有我想要的那么快。通过使用 OpenAsyncSession 并为每 1024 条记录调用 SaveChangesAsync 并再次通过调用 OpenAsyncSession 创建新 session 而不是在 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;
}
}

谢谢

最佳答案

卡维,

这里有很多问题。

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

2) 如果没有 if (tasks.Count >= NUM​​BER_OF_CORES),您的代码将生成尽可能多的任务(受从文件中读取行的限制,即 真的很快。这往往会产生数千个并发任务,并且会使 RavenDB 一次可以插入的请求数量过载。

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

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

关于c# - 插入 RavenDB;最快的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11176887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com