ruby读取csv但同时在两个不同的行上

时间:2015-04-22 06:40:21

标签: ruby multithreading file pointers csv

假设我可以通过内置的CSV解析器读取CSV。像这样:

CSV.foreach(file_path, quote_char: '"', col_sep: ',', row_sep: :auto, headers: true) { |line|
    #some code here
}

此代码从头到尾读取并解析整个csv。

所以,我的问题是,是否有可能或一些无耻的方式同时阅读CSV>像脚本的一部分只是通过访问磁盘上的文件从头到尾读取csv的一半和第二部分脚本?

!无需将csv读入数组/内存/其他

ruby​​伪代码(知道文件中的所有行)

threads = []

threads << Thread.new do
    csvread(startrowindex,halfrowindex)
    end

threads << Thread.new do
   csvread(halfrowindex+1,endrowindex)
   end
threads.each(&:join)

1 个答案:

答案 0 :(得分:2)

我在评论中所说的内容 - 例如,使用peach gem:

require 'csv'
require 'peach'

CSV.foreach("a.csv").peach(2) do |row|
  row.map(&:to_i).reduce(&:+)
end

如果您正在使用MRI,您将患有GIL;如果工作人员正在做一些繁重的工作,这段代码应该比非线程的慢一点。如果你的缓慢与CPU有关,请切换到JRuby或Rubinius,因为他们没有GIL。如果它与IO阻塞有关,那么即使在MRI上也应如此。