【问题标题】:How to avoid "failed to allocate memory(NoMemory Error) with Axlsx gem?如何避免“使用 Axlsx gem 分配内存失败(NoMemory 错误)?
【发布时间】:2017-02-20 16:25:25
【问题描述】:

此脚本的目的是将 csv 文件转换为一个 xlsx 文件。我有 33 个 csv 文件,每个 csv 文件由 1229 列、289 行组成,而我试图将所有这些 csv 文件读入一个 xlsx 文件时出现以下错误

cell_serializer.rb:138:in 'value_serialization': 分配内存失败(NoMemoryError)

我认为一个文件太大而无法包含所有数据,所以我决定分成两个 .xlsx 文件,但我得到了同样的错误。以下是我正在使用的脚本。

require 'axlsx'

def csv_to_xlsx(xlsx_file_name,file_names,p)
 file_names.each do | f |
 i = 0
 CSV.foreach(f) do |row|
   if i == 0
     p.workbook.add_worksheet(:name => File.basename(f)) do | sheet |
       sheet.add_row row
     end
   elsif
     p.workbook.sheet_by_name(File.basename(f)).add_row row
   end
   i = i+1
 end
 p.serialize(xlsx_file_name)
 end
end

csv_files = Dir.glob("./csv_file/*")
file_count = 0
file_names1 = Array.new
file_names2 = Array.new
csv_files.each do | f |
  file_count = file_count+1
  if file_count < 16
    file_names1 << f
  elsif
    file_names2 << f
  end
end

package1 = Axlsx::Package.new
package2 = Axlsx::Package.new
csv_to_xlsx('./xls_file/data01.xlsx',file_names1,package1)
csv_to_xlsx('./xls_file/data02.xlsx',file_names2,package2)

为了实现我想要的,我尝试了电子表格,它工作得很好而且使用简单,但它只创建不能包含超过 256 列的 .xls 文件。

任何避免 NoMemory 错误的想法,感谢您提前提供帮助。

我的 ruby​​ 版本是 2.3.0p0

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rubygems


    【解决方案1】:

    我确实将这些 csv 文件分成了 2 个以上的 .xlsx 文件,它解决了这个问题。但最好是我可以将所有 csv 文件写入一个 .xlsx 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2017-05-04
      • 2013-06-20
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多