gpt4 book ai didi

node.js - 在 node-csv-parser : RangeError: Maximum call stack size exceeded 中调用 node-mongodb-native

转载 作者:可可西里 更新时间:2023-11-01 10:44:37 26 4
gpt4 key购买 nike

我正在使用 node-csv-parser读取 csv 数据并使用 mongoose 将其存储在 mongodb 中。但是,我正在尝试加快导入速度,并且我想使用 node-mongodb-native 公开的 native 保存方法进行评估,使用 Model.collection 在 mongoose 中访问. (这是我在 Mongo 总部的办公时间与一位 mongo 工程师交谈的建议)。

node-csv-parser 每次读取 csv 的新行时都会触发 data 事件。在这个事件中,我读入了数据行,从中创建了一个新的数据点,并将其保存在 mongo 中。我可以使用 Mongoose 模型 TestDataPoint 将数据点保存在 data 事件中。但是,如果我尝试为数据点创建一个 javascript 对象并使用 TestDataPoint.collection.save 保存它,我会收到错误:RangeError: Maximum call stack size exceeded .

我试过以各种不同的方式调用这个本地保存,包括直接通过 mongoose.connection.db.collection("testdatapoints") 获取集合并将其发送到async 提供的队列模块,但总是有或多或少相同的结果。我可以在代码中的其他地方使用 native 驱动程序成功保存数据点,甚至在 csv 导入的 end 事件中,只是不在 data 事件中。

我还通过记录确定在我当前的设置(64 位 AMD 处理器上的 Ubuntu 12.04,8 GB RAM)上,代码在抛出堆栈错误之前迭代了 csv 的 154 行,但是没有写入数据从这个 data 事件中到数据库。似乎无意中发生了某种递归(?),或者它可能是 node-csv-parser 和 node-mongodb-native 之间的某种错误。

为了澄清,我在下面的(编辑/更新的)示例代码中,日志重复了 154 次:

about to call native save
just called native save

然后说:

in native save callback for dataPoint: 1
Native save failed, error:RangeError: Maximum call stack size exceeded
in native save callback for dataPoint: 2
Native save failed, error:RangeError: Maximum call stack size exceeded

直到数据点 154,然后它再重复“即将调用/刚刚调用”154 次,然后记录数据点 155-308 的错误,依此类推(我有很多数据点要导入)。这个 154 数字是相当可重复的,我想我已经观察到它一次或两次经过 155 行。

有人建议我将保存调用包装在 process.nextTick() 中以清除堆栈。当我尝试这样做时,在我的日志中我可以看到保存被调用了 154 次,然后 process.nextTick() 被调用了 154 次,然后 RangeError 被记录了 154 次,然后序列重复。

我正在运行 node 0.8.2、mongoose 2.7.2 和 mongodb 2.0.4。

csv()
.fromPath(path)
.on("data", (data, index) ->

# cellTest is an instance of a Mongoose model object
newDataPoint =
testId: cellTest.testId # this assignment was causing recursion in the native save
dataPoint: data[1]
testTime: data[2]/3600
cycleIndex: data[3]

console.log "about to call native save"

# TestDataPoint is my my mongoose model, which saves fine, but
# this call throws the RangeError: Maximum stack size exceeded
TestDataPoint.collection.save newDataPoint, safe:true, (err, dataPoint) ->
console.log "in native save callback for dataPoint: " + data[1]
if err
console.log "Native save failed, error:" + err

console.log "just called native save"

.on("end", (count) ->
newDataPoint =
dataPoint: 100 # dummy values
testTime: 200
cycleIndex: 300

# This call works, saves the data point
TestDataPoint.collection.save newDataPoint, safe:false, null
)
.on("error", (err) ->
console.log err
)

编辑:已解决!

作业:

testId: cellTest.testId

导致保存递归。与 cellTest 是另一个 Mongoose 模型的实例有关。将分配更改为:

testId: parseInt(cellTest.testId)

消除了递归并允许执行保存。

最佳答案

这个问题已经解决了。在我的实际代码中,我将 newDataPoint 的一个属性设置为等于另一个 Mongoose 模型对象的整数属性。 (下次我会知道不要从我的样本中“简化”那个细节!)这不知何故导致了保存时的递归。

我通过围绕该值的赋值包装一个 parseInt() 来修复它。保存工作正常,比使用 Mongoose 快大约 3 倍(我知道我放弃了一些不使用 Mongoose 的东西,但这对我的应用程序来说很好,我在其中记录了很多数据点,而没有一个点是全部那很重要)。

关于node.js - 在 node-csv-parser : RangeError: Maximum call stack size exceeded 中调用 node-mongodb-native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11573241/

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