如何快速切割和切割大型数据文件?
我想以相当快速和高效的方式切割和切割大型数据文件,直至演出。如果我使用类似UNIX的“CUT”,那么速度非常快,即使在CYGWIN环境中也是如此。如何快速切割和切割大型数据文件?
我试过开发和标杆各种Ruby脚本来处理这些文件,并始终用冰的结果告终。
你会怎么用Ruby做,使这个不那么狗慢?
为什么不一起将它们合并 - 用切做自己最擅长的和Ruby提供胶水/值与CUT结果补充的吗?你可以运行shell脚本,如下所示:
puts `cut somefile > foo.fil`
# process each line of the output from cut
f = File.new("foo.fil")
f.each{|line|
}
这个问题让我想起蒂姆·布雷的Wide Finder project我。最快捷的方式,他可以用Ruby读取一个Apache日志文件,并找出哪些文章已经获取的最多的是这个剧本:
counts = {}
counts.default = 0
ARGF.each_line do |line|
if line =~ %r{GET /ongoing/When/\d\d\dx/(\d\d\d\d/\d\d/\d\d/[^ .]+) }
counts[$1] += 1
end
end
keys_by_count = counts.keys.sort { |a, b| counts[b] <=> counts[a] }
keys_by_count[0 .. 9].each do |key|
puts "#{counts[key]}: #{key}"
end
它把这个代码CPU的7½秒,13½秒流逝,工艺在去年的1.67Ghz PowerBook上有一百万次的变化记录,四分之一演出。
我猜你的Ruby实现正在阅读的整个文件之前处理。 Unix的切割工作是通过一次读取一个字节的东西,然后立即将转储到输出文件。当然有一些缓冲,但不超过几KB。
我的建议是:尽量做处理就地用尽可能少的寻呼或回溯越好。
我怀疑问题是ruby正在读取内存中的整个文件。查看内存和磁盘使用情况,同时运行该命令进行验证。
我猜主要的原因是因为切割用C语言编写,并且只能做一两件事,所以它可能已经被编译成十分金属。这可能不仅仅是调用系统调用。
然而,ruby版本一次做很多事情。调用方法比C函数调用在Ruby中慢得多。
记住老年和trechery击败青年和技能在UNIX:http://ridiculousfish.com/blog/archives/2006/05/30/old-age-and-treachery/
而不是写入临时文件,你可以这样做:pipe = IO.popen(“cut ...”); pipe.each_line {| line | ...} – 2009-07-29 16:22:34