我想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倍。 从鲁比的角度来看,有没有实现它一个更好的办法?
你有几个问题:
File::RDWR||File::CREAT
始终计算为File::RDWR
。 你的意思是File::RDWR|File::CREAT
( |
而非||
)。
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。
不知道您正在使用的操作系统,但最快的方法是我们一个系统复制到文件串联到一个大文件,你可以编写脚本。 一个例子。 如果你开始像“1”的字符串,并将它显示到一个文件
echo "1" > file1
你可以在许多的时间串连这个文件以自己一个新的文件,在Windows中,您必须使用参数/ B为二进制文件复制到做到这一点。
copy /b file1+file1 file2
给你的12个字节的文件2(包括CR)
copy file2+file2 file1
为您提供了24个字节等
我会让数学(和Rubying本的乐趣)给你,但你会达到你的规模足够快,可能比接受的答案更快。
一个相关的答案,如果你想写二进制零任何大小,只要做到这一点使用dd命令(Linux的/苹果机):
dd if=/dev/zero of=output_file bs=128K count=8000
BS是块的大小(字节数以一次读/写计数是块的数量上面一行中OUTPUT_FILE在我的机器上只需10秒写入的零的1 Gegabyte。:
1048576000 bytes (1.0 GB) copied, 10.275 s, 102 MB/s
可能是鼓舞人心的人!
该数据是所有的人? 那么有没有必要写的那些,只写一的数量。
file.write( 2*1024*1024*1024*1024 )
很简单,是吗?