4

Axlsx を使用して Excel ファイルを作成しています。小さなデータセットの場合、問題なく動作します。しかし、データセットが大きくなると、ハングアップします。私はプロセスで strace を実行しましたが、多くの brk を実行していました。

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。どんな助けでも素晴らしいでしょう。ありがとう。

4

2 に答える 2

5

SOに注意を払い始める必要があるようです!randymです(axlsxの作者)

必要なことをやり遂げるのに役立ついくつかの点を指摘したいと思います。

  1. ファイルに書き込む場合は、Package#serialize を検討してください。高速だからではなく、維持するコードが少ないからです。

    p.serialize 'ファイル名.xlsx'

  2. ここ数週間でパフォーマンスが大幅に改善されました。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

お役に立てれば

于 2012-04-18T04:55:36.563 に答える
2

列の自動幅機能を処理するRMagickを無効にすることができます.これは非常に重いプロセスであるためです.

a = Axlsx::Package.new   
a.use_autowidth = false
于 2012-04-09T05:20:45.040 に答える