假设我可以通过内置的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)
答案 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上也应如此。