我正在使用Axlsx创建一个excel文件。对于小型数据集,它工作正常。但是一旦数据集变大,它就会挂起。我对这个过程进行了分析,它做了很多事。
a = Axlsx::Package.new
book = a.workbook
book.add_worksheet(:name => "test") do |sheet|
input_array.each do |input_data|
...# covert input_data to row_data
sheet.add_row(row_data)
end
end
File.open("testfile", 'w') { |f| f.write(p.to_stream().read) }
我的input_array大小约为400,000,因此工作表有400,000行,非常大。它被困在p.to_stream().read
。任何帮助都会很棒。谢谢。
答案 0 :(得分:5)
看起来我需要开始关注SO! 这是randym(axlsx的作者)
有几件事我想指出,应该帮助你得到你需要做的事,好吧......完成!
如果您正在写文件,请考虑Package#serialize - 不是因为它更快,而是因为维护的代码较少。
p.serialize'filename.xlsx'
过去几周取得了重大的业绩改善。请升级到1.1.1 gem不再依赖于RMagic,并且不再需要use_autowidth = false。
https://github.com/randym/axlsx
主人基准:
Benchmarks w/40k rows:
user system total real
axlsx_noautowidth 68.130000 1.690000 69.820000 ( 80.257108)
axlsx 61.520000 2.290000 63.810000 ( 78.187423)
axlsx_shared 53.280000 1.170000 54.450000 ( 62.880780)
axlsx_stream 52.110000 1.360000 53.470000 ( 61.980672)
csv 10.670000 0.930000 11.600000 ( 14.901387)
Benchmarks w/4k rows:
user system total real
axlsx_noautowidth 4.880000 0.120000 5.000000 ( 5.314383)
axlsx 5.470000 0.110000 5.580000 ( 5.853739)
axlsx_shared 5.720000 0.080000 5.800000 ( 6.135263)
axlsx_stream 4.840000 0.090000 4.930000 ( 5.194801)
csv 1.090000 0.090000 1.180000 ( 1.484763)
以下是基准测试文件:
https://gist.github.com/2411144
希望这有帮助
答案 1 :(得分:2)
您可以尝试禁用处理列自动宽度功能的RMagick,因为它是一个非常繁重的进程AFAIK。
a = Axlsx::Package.new
a.use_autowidth = false