草庐IT

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

coder 2023-11-06 原文

我正在使用 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/

有关node.js - 在 node-csv-parser : RangeError: Maximum call stack size exceeded 中调用 node-mongodb-native的更多相关文章

  1. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  4. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  5. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  6. ruby-on-rails - 使用 RSpec 测试 CSV.generate - 2

    我在Rails3.1项目中有以下助手-我只是想知道是否有办法测试CSV.generate调用。我很想说我知道如何去做,但事实是我什至不知道从哪里开始。任何想法表示赞赏。require'csv'moduleAdmin::PurchasesHelperdefcsv_purchase_listcolumns=['course','amount','first_name','last_name','contact_phone','contact_mobile','created_at']CSV.generate(:col_sep=>";",:row_sep=>"\r\n",:headers=>

  7. ruby - 如何从 ARGF 读取 csv - 2

    在Ruby1.9中,我如何从ARGF中读取CSV?我尝试了以下方法,但没有打印任何内容:require'csv'CSV(ARGF).readdo|row|prowendhttp://www.ruby-doc.org/core-1.9.3/ARGF.htmlhttp://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html 最佳答案 如果你想偷懒你可以试试:CSV.new(ARGF.file).eachdo|row|...end来源:http://www.ruby-doc.org/std

  8. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  9. ruby-on-rails - 我真的需要在 Rails 中使用 csv gem 吗? - 2

    我的问题很简单:我是否必须在使用RubyonRails的类上require'csv'?如果我打开一个railsconsole并尝试使用CSVgem它可以工作,但我必须在文件中这样做吗? 最佳答案 CSVlibrary是ruby​​标准库的一部分;它不是gem(即第三方库)。与所有标准库(与核心库不同)一样,csv不会由ruby​​解释器自动加载。所以是的,在您的应用程序中某处您确实需要要求它:irb(main):001:0>CSVNameError:uninitializedconstantCSVfrom(irb):1from/Us

  10. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

随机推荐