6

我想将 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

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

不知道您使用的是哪个操作系统,但最快的方法是给我们一个系统副本以将文件连接到一个大文件,您可以编写脚本。一个例子。如果您以“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

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

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

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

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

可能对某人有启发!

于 2013-09-10T13:33:19.420 回答
-2

数据都是1?那么就不用写个了,只写个数。

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

很简单,是吗?

于 2012-08-08T21:32:27.010 回答