gpt4 book ai didi

ruby-on-rails - 在 Rails 应用程序中读取大型 csv 文件会占用大量内存 - 减少内存消耗的策略?

转载 作者:数据小太阳 更新时间:2023-10-29 08:27:14 28 4
gpt4 key购买 nike

我有一个 Rails 应用程序,它允许用户上传 csv 文件并在 delayed_job gem 的帮助下安排读取多个 csv 文件。问题是应用程序将每个文件完整地读入内存,然后写入数据库。如果它只读取 1 个文件,那没问题,但是当读取多个文件时,服务器上的 RAM 会变满并导致应用程序挂起。

我正在尝试为这个问题找到解决方案。

我研究的一种解决方案是将 csv 文件分成更小的部分并将它们保存在服务器上,然后读取更小的文件。看这个link

 example: split -b 40k myfile segment

不是我的首选解决方案。在我不必破坏文件的情况下,是否还有其他方法可以解决此问题。解决方案必须是 ruby​​ 代码。

谢谢,

最佳答案

您可以使用 CSV.foreach只读取 CSV 文件的 block :

 path = Rails.root.join('data/uploads/.../upload.csv') # or, whatever
CSV.foreach(path) do |row|
# process row[i] here
end

如果它在后台作业中运行,您还可以调用 GC.startn 行。


工作原理

CSV.foreach 对 IO 流进行操作,如您在此处所见:

def IO.foreach(path, options = Hash.new, &block)
# ...
open(path, options) do |csv|
csv.each(&block)
end
end

csv.each 部分是对 IO#each 的调用, 它逐行读取文件(rb_io_getline_1 调用)并将读取的行保留为垃圾收集器:

static VALUE
rb_io_each_line(int argc, VALUE *argv, VALUE io)
{
// ...
while (!NIL_P(str = rb_io_getline_1(rs, limit, io))) {
rb_yield(str);
}
// ...
}

关于ruby-on-rails - 在 Rails 应用程序中读取大型 csv 文件会占用大量内存 - 减少内存消耗的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24001467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com