1

我的问题是:我有许多非常大的数据文件(总计几千兆字节),除了实际数据之外,文件开头还包含一些注释行。

所以它们看起来像这样:

# This is a file containing data.
# Here's how to use it:
# ...
# Now, let's get to the actual data:
DATA DATA DATA

我要完成的任务是尽快从这些文件中删除评论,因为我用来将它们提取到我的数据库中的工具无法处理这些评论。

我目前的方法是这样的:

# For each data file...
system "sed '/^\\#/d' #{filename} > #{filename}.tmp"
system "mv #{filename}.tmp #{filename}"

这可行,但总共需要大约 1 小时,因为文件太大了。我的假设是必须有一种更有效的方法来执行此操作,因为我确定注释仅位于文件的开头,因此无需在整个文件中搜索它们。

我不太在意该解决方案是使用纯 Ruby 还是像上面那样的 shell 命令,只要它比当前方法工作​​得快得多。

4

2 回答 2

0

唔。你的方法是正确的。对于大文件来说,分叉系统工具是一个很好的策略。

我想知道这么简单的转码怎么会这么慢。有些东西要探索...

  • 您确定 sed(1) 步骤是缓慢的部分吗?如果确实是导入速度很慢,请确保您没有将每一行都变成单独的事务
  • 您的文件是否在某种网络卷上?如果是这样,您可以在服务器而不是客户端上运行脚本吗?
于 2012-08-10T13:39:53.960 回答
0

是的,你可以像这样很快地做到这一点,我想你只想让 # 离开,否则要适应,但请记住,写入的字符串需要与读取的字符串完全一样长。

File.open('big.txt', 'rb+') do |file|
  loop do
    line = file.readline
    if (line[0]=='#')
      file.seek(-line.length, IO::SEEK_CUR)
      file.write line.sub!(/#/," ")
    else
      break
    end
  end
end
于 2012-08-10T14:44:32.517 回答