6

2TBのデータを1つのファイルに書き込みたいのですが、将来的にはペタバイトになる可能性があります。

データはすべてで構成されています'1'。たとえば、"1111111111111......11111"(各バイトは「1」で表されます)で構成される2TBのデータ。

以下は私のやり方です:

File.open("data",File::RDWR||File::CREAT) do |file|
  2*1024*1024*1024*1024.times do
  file.write('1')
  end
end

つまり、File.write2TB回と呼ばれます。Rubyの観点から、それを実装するためのより良い方法はありますか?

4

4 に答える 4

8

あなたにはいくつかの問題があります:

  1. File::RDWR||File::CREAT常にに評価されFile::RDWRます。つまりFile::RDWR|File::CREAT|ではなく||)。

  2. 2*1024*1024*1024*1024.times doループを1024回実行してから、ループの結果に左側のものを掛けます。つまり(2*1024*1024*1024*1024).times do

あなたの質問に関して、私は一度に1024バイトを書き込むことによって大幅なスピードアップを得る:

File.open("data",File::RDWR|File::CREAT) do |file|
  buf = "1" * 1024
  (2*1024*1024*1024).times do
    file.write(buf)
  end
end

実験して、1024よりも優れたバッファサイズを見つけることができます。

于 2012-08-08T21:34:02.207 に答える
1

使用しているOSはわかりませんが、最速のアプローチは、システムコピーを使用して、ファイルを1つの大きなファイルに連結することです。スクリプトを作成できます。例。「1」のような文字列で開始し、それをファイルにエコーする場合

echo "1" > file1

このファイルをそれ自体と何度も新しいファイルに連結できます。Windowsでは、バイナリコピーにパラメータ/bを使用してこれを行う必要があります。

copy /b file1+file1 file2

12バイトのfile2(CRを含む)を提供します

copy file2+file2 file1

あなたに24バイトなどを与えます

私はあなたに数学(そしてこれをRubyすることの楽しさ)をあなたに任せます、しかしあなたはあなたのサイズに十分速くそしておそらく受け入れられた答えより速く到達するでしょう。

于 2012-08-09T00:08:57.217 に答える
0

関連する答えは、任意のサイズの2進ゼロを書き込みたい場合は、ddコマンド(Linux / Mac)を使用してこれを行うだけです。

dd if=/dev/zero of=output_file bs=128K count=8000

bsはブロックサイズ(一度に読み取り/書き込みするバイト数。countはブロック数です。上記の行は、私のマシンでわずか10秒でoutput_fileに1ゲガバイトのゼロを書き込みます。

1048576000 bytes (1.0 GB) copied, 10.275 s, 102 MB/s

誰かに刺激を与える可能性があります!

于 2013-09-10T13:33:19.420 に答える
-2

データはすべてのものですか?そうすれば、1つを書く必要はありません。1つの数を書くだけです。

file.write( 2*1024*1024*1024*1024 )

簡単ですよね?

于 2012-08-08T21:32:27.010 に答える