将数据写入文件的最有效方法

时间:2012-08-08 20:46:41

标签: ruby io

我想将2TB数据写入一个文件,将来它可能是一个PB级。

数据由所有'1'组成。例如,2TB数据由"1111111111111......11111"组成(每个字节由'1'表示)。

以下是我的方式:

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

这意味着,File.write被称为2TB次。从Ruby的角度来看,有没有更好的方法来实现它?

4 个答案:

答案 0 :(得分:7)

你有一些问题:

  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

  3. 关于您的问题,我通过一次写入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更好的缓冲区大小。

答案 1 :(得分:0)

不知道您正在使用哪个操作系统,但最快的方法是将系统副本连接到一个大文件,您可以编写脚本。 一个例子。 如果您以“1”之类的字符串开头并将其回显到文件

echo "1" > file1

您可以将此文件与自身连接一段时间到新文件,在Windows中您必须使用参数/ b进行二进制复制才能执行此操作。

copy /b file1+file1 file2

给你一个12字节的文件2(包括CR)

copy file2+file2 file1

给你24个字节 等

我会把数学(和Rubying的乐趣)告诉你,但你会很快达到你的体型,可能比你接受的答案更快。

答案 2 :(得分:0)

一个相关的答案,如果你想用任何大小编写二进制零,只需使用dd命令(Linux / Mac)执行此操作:

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

bs是块大小(一次读/写的字节数)。 count是块数。 上面的一行在我的机器上只需10秒就在output_file中写入1 Gegabyte的零:

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

可能会激励某人!

答案 3 :(得分:-2)

数据全部是?然后就没有必要写那些,只需写下一些数字。

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

简单,是吗?