【发布时间】:2018-04-15 06:33:59
【问题描述】:
我有 2GB 文件(其中 9 个),其中包含大约 12M 的字符串记录,我想将每个记录作为文档插入到本地 mongodb(Windows)。
现在我正在逐行读取并插入每隔一行(第一行是不必要的标题),如下所示:
bool readingFlag = false;
foreach (var line in File.ReadLines(file))
{
if (readingflag)
{
String document = "{'read':'" + line + "'}";
var documnt = new BsonDocument(
MongoDB
.Bson
.Serialization
.BsonSerializer
.Deserialize<BsonDocument>(document));
await collection.InsertOneAsync(documnt);
readingflag = false;
}
else
{
readingflag = true;
}
}
此方法有效,但没有我预期的那么快。我现在在文件中间,我假设它会在大约 4 小时内结束,只需要一个文件。 (我的所有数据需要 40 小时)
我认为我的瓶颈是文件读取,但由于文件非常大,VS 不允许我将其加载到内存中(内存不足异常)。
还有其他我在这里想念的方式吗?
【问题讨论】:
-
不是一次插入一个,为什么不批量插入呢?我相信连接有一个可用的
InsertBatch方法,您可以在其中读出一些行并将其插入。 -
我刚刚使用
File.ReadLines()读取了一个包含 605.6 万行的 960mb UTF-8 文本文件,并为每一行反序列化一个字符串(您的document字符串与"test"作为line每行),只用了 19 秒。所以我怀疑你的瓶颈是读取甚至反序列化,但你可以通过使用Stopwatch 计时并评论你的InsertOneAsync()行来确定。一旦您评论该行,可能只需要一两分钟。 -
你能分享至少10行的示例文件吗?
-
BenM - 我会检查答案并更新关于@Quantic - 你是对的,我现在检查了。 jOSe - 都是 100 个字符