将数据写入到文件最有效的方法(most efficient way to write data in

2019-09-21 01:08发布

我想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倍。 从鲁比的角度来看,有没有实现它一个更好的办法?

Answer 1:

你有几个问题:

  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。



Answer 2:

不知道您正在使用的操作系统,但最快的方法是我们一个系统复制到文件串联到一个大文件,你可以编写脚本。 一个例子。 如果你开始像“1”的字符串,并将它显示到一个文件

echo "1" > file1

你可以在许多的时间串连这个文件以自己一个新的文件,在Windows中,您必须使用参数/ B为二进制文件复制到做到这一点。

copy /b file1+file1 file2

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

copy file2+file2 file1

为您提供了24个字节等

我会让数学(和Rubying本的乐趣)给你,但你会达到你的规模足够快,可能比接受的答案更快。



Answer 3:

一个相关的答案,如果你想写二进制零任何大小,只要做到这一点使用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

可能是鼓舞人心的人!



Answer 4:

该数据是所有的人? 那么有没有必要写的那些,只写一的数量。

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

很简单,是吗?



文章来源: most efficient way to write data into a file
标签: ruby io