【发布时间】:2013-07-09 11:16:09
【问题描述】:
我尝试使用(大约 50 000 行)读取文件并在 mongodb 中解析后保存每一行。 Mongodb保存功能是异步的。为了遍历文件,我使用 node-lazy 模块。
我得到的是只有一部分记录保存在 mongodb 中(不是所有函数都调用保存回调)
var stream = fs.createReadStream(inputFile)
new lazy(stream)
.lines
.map(String)
.forEach(function(line){
db[collection].save(parseLine(line), function(err){
if (err){
console.log(err)
} else {
count++;
}
})
}
)
所以没有错误,但是计数
所以我想知道解决问题的最佳方法是什么。
更新:
我通过在 forEach 中使用 syncronios 解析函数解决了这个问题,然后当文件被完全读取时,我使用 async.mapSeries 将数据保存到 mongodb。
但我仍然想知道是否可以使用 node-lazy 处理异步,我在文档中没有找到它,也许它只是不可能。
【问题讨论】:
-
您如何验证只保存了一半的记录?您是否也可以验证 forEach 是否触发了所需的次数?
-
我检查了 mongodb 集合(在 db 中)。 forEach 被触发了所需的次数。查看我的 UPD。
-
也许你写操作太快了。谷歌对此保持沉默。但是有可能您尝试在太短的时间内执行多少次写入(在您的情况下是 50k 次写入)。
-
是的,我可以猜到问题的可能根源,因此我需要按顺序进行写入以确保正确的行为。我要问的是可以在其中使用惰性 forEach 和 async 函数。
-
你可以创建类似 Promises 的东西来链接请求,或者至少批量执行它们。
标签: node.js stream lazy-loading