bja*_*obs 2 ruby csv foreach multithreading ruby-on-rails
我已经看到了一些帖子,没有真正的答案或过时的答案,所以我想知道是否有任何新的解决方案。我有一个巨大的 CSV 我需要读入。我不能在它上面调用 open() ,因为它会杀死我的服务器。我别无选择,只能使用 .foreach()。
这样做,我的脚本将需要 6 天才能运行。我想看看我是否可以通过使用线程并将任务分成两个或四个来减少它。所以一个线程读取第 1-n 行,一个线程同时读取第 n+1-end 行。
所以我需要只能在一个线程中读取文件的后半部分(稍后如果我将其拆分为更多线程,只需通过特定行的特定行)。
无论如何,Ruby 中有这样做吗?这可以从某一行开始吗?
CSV.foreach(FULL_FACT_SHEET_CSV_PATH) do |trial|
Run Code Online (Sandbox Code Playgroud)
编辑: 只是为了了解我的一个线程是什么样子的:
threads << Thread.new {
CSV.open('matches_thread3.csv', 'wb') do |output_csv|
output_csv << HEADER
count = 1
index = 0
CSV.foreach(CSV_PATH) do |trial|
index += 1
if index > 120000
break if index > 180000
#do stuff
end
end
end
}
Run Code Online (Sandbox Code Playgroud)
但是正如您所看到的,它必须迭代文件,直到它在开始之前记录 120,000。因此,目标是通过从第 120,000 行开始读取来消除读取第 120,000 行之前的所有行。
小智 5
如果仍然相关,您可以使用.with_indexafter 执行以下操作:
rows_array = []
CSV.foreach(path).with_index do |row, i|
next if i == 0 #skip first row
rows_array << columns.map { |n| row[n] }
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |