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を使用するのか、上記のようなシェルコマンドを使用するのかはあまり気にしません。

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 に答える