ファイルは本質的に連続したデータのブロックとしてディスクに保存されるため、その一部を削除すると、少なくともそれ以降のデータを書き換える必要があります。これは本質的に、あなたが言うように、大きなファイルでは特に効率的ではないことを意味します。したがって、一般的には、このような問題が発生しないようにファイル サイズを制限することをお勧めします。
いくつかの「妥協」ソリューションは、ファイルを1行ずつ2番目のファイルにコピーし、それを移動して最初のファイルを置き換えることです。これにより、ファイルがメモリに読み込まれることは回避されますが、ハードディスクへのアクセスは回避されません。
require 'fileutils'
open('file.txt', 'r') do |f|
open('file.txt.tmp', 'w') do |f2|
f.each_line do |line|
f2.write(line) unless line.start_with? "Person2"
end
end
end
FileUtils.mv 'file.txt.tmp', 'file.txt'
さらに効率的には、ファイルを読み書きで開き、削除したい位置までスキップしてから、残りのデータを元に戻すことです。今それをしてください)。