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

问题描述 投票:0回答:5

我想将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的角度来说,有没有更好的实现方法?

ruby io
5个回答
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 更好的缓冲区大小。


1
投票

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

echo "1" > file1

你可以多次将此文件与其自身连接成一个新文件,在 Windows 中你必须使用参数 /b 进行二进制复制才能做到这一点。

copy /b file1+file1 file2

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

copy file2+file2 file1

给你24个字节 等等

我会让你计算数学(以及 Rubying 的乐趣),但你会足够快地达到你的尺寸,并且可能比接受的答案更快。


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

可能会对某人有所启发!


0
投票

您可以将

file.sync
设置为
false
。 然后它会将数据批量写入磁盘,而不是一个一个地写入。

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

-2
投票

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

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

很简单,是吗?

© www.soinside.com 2019 - 2024. All rights reserved.