阅读非常大的Excel 使用节点或ruby的最佳途径

我需要parsing大小约为25 MB的XLXS [有大约100万条logging]。 我阅读了很多Node模块,包括下面

https://github.com/trevordixon/excel.js https://github.com/dkiyatkin/node-office 

我也试着用Roo来使用Ruby

 https://github.com/Empact/roo 

但他们挂了。 有没有build议要做到这一点或者我需要最终分裂成多个小块的文件?

按照“carlosramireziii”的build议使用“oxcelix”!

“ https://github.com/gbiczo/oxcelix ”

 2.0.0-p247 :001 > require 'oxcelix' => true 2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx") Killed root@createresume:/var/www/fullcontact/current/public/uploads# irb 2.0.0-p247 :001 > require 'oxcelix' => true 2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx") Errno::EEXIST: File exists - /var/www/fullcontact/shared/uploads/tmp from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir' from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir' from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:174:in `block in mkdir' from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:173:in `each' from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:173:in `mkdir' from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/oxcelix-0.3.2/lib/oxcelix/workbook.rb:52:in `initialize' from (irb):2:in `new' from (irb):2 from /usr/local/rvm/rubies/ruby-2.0.0-p247/bin/irb:13:in `<main>' 2.0.0-p247 :003 > exit root@createresume:/var/www/fullcontact/current/public/uploads# rm -rf tmp/ root@createresume:/var/www/fullcontact/current/public/uploads# irb 2.0.0-p247 :001 > require 'oxcelix' => true 2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx") Killed root@createresume:/var/www/fullcontact/current/public/uploads# 

我有一个非常大的XML文件类似的问题。 性能明智的是最好把它“切”成更小的垃圾,并分别处理它们中的每一个。

根据您使用的parsing库,parsing例程可能会尝试将整个XLXS文件转换为对象,然后将其存储在内存中。 对于非常大的文件,这可能会导致您所看到的挂起行为。

经常用来避免这个问题的一个选项是使用SAXparsing器 。 SAXparsing器不是一次试图parsing整个文件,而是一次一个位地顺序读取每一个文件,这不会导致前一个方法的内存爆炸。

对于parsingXLSX文档,您应该尝试使用下面的SAXparsing器的Ruby的Oxcelix gem。

https://github.com/gbiczo/oxcelix

更新:

不幸的是,Oxcelix gem确实在封面下使用了SAXparsing,但是它将parsing结果作为一个数组返回,如果是非常大的文件,则会在内存中爆炸。

如果您能够将您的Excel工作表转换为XML,那么您可以使用任何SAX风格的parsing器。 在这种情况下,我会推荐这个SAXMachine的 fork,它允许你创build声明模型并使用lazy选项顺序返回它们。