2008-09-23 115 views
5

我想以相当快速和高效的方式切割和切割大型数据文件,直至演出。如果我使用类似UNIX的“CUT”,那么速度非常快,即使在CYGWIN环境中也是如此。如何快速切割和切割大型数据文件?

我试过开发​​和标杆各种Ruby脚本来处理这些文件,并始终用冰的结果告终。

你会怎么用Ruby做,使这个不那么狗慢?

回答

1

为什么不一起将它们合并 - 用切做自己最擅长的和Ruby提供胶水/值与CUT结果补充的吗?你可以运行shell脚本,如下所示:

puts `cut somefile > foo.fil` 
# process each line of the output from cut 
f = File.new("foo.fil") 
f.each{|line| 
} 
+1

而不是写入临时文件,你可以这样做:pipe = IO.popen(“cut ...”); pipe.each_line {| line | ...} – 2009-07-29 16:22:34

2

这个问题让我想起蒂姆·布雷的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上有一百万次的变化记录,四分之一演出。

1

我猜你的Ruby实现正在阅读的整个文件之前处理。 Unix的切割工作是通过一次读取一个字节的东西,然后立即将转储到输出文件。当然有一些缓冲,但不超过几KB。

我的建议是:尽量做处理就地用尽可能少的寻呼或回溯越好。

0

我怀疑问题是ruby正在读取内存中的整个文件。查看内存和磁盘使用情况,同时运行该命令进行验证。

我猜主要的原因是因为切割用C语言编写,并且只能做一两件事,所以它可能已经被编译成十分金属。这可能不仅仅是调用系统调用。

然而,ruby版本一次做很多事情。调用方法比C函数调用在Ruby中慢得多。

记住老年和trechery击败青年和技能在UNIX:http://ridiculousfish.com/blog/archives/2006/05/30/old-age-and-treachery/