原始(二进制)数据太大而无法写入磁盘。如何按块写入磁盘(追加)?

Raw (binary) data too big to write to disk. How to write chunk-wise to disk (appending)?

我在 R 中有一个很大的原始向量(即二进制数据数组),我想将其写入磁盘,但我收到一条错误消息,告诉我该向量太大。这是一个可重现的示例和我得到的错误:

> writeBin(raw(1024 * 1024 * 1024 * 2), "test.bin")

Error in writeBin(raw(1024 * 1024 * 1024 * 2), "test.bin") : 
  long vectors not supported yet: connections.c:4147

我注意到这与 2 GB 的文件限制有关。如果我尝试少写一个字节 (1024 * 1024 * 1024 * 2 - 1),它工作得很好。

我正在考虑做一些变通方法,我将大文件的块分批写入磁盘,只将二进制数据附加到磁盘,如下所示:

large_file = raw(1024 * 1024 * 1024 * 2) 
chunk_size = 1024*1024*512
n_chunks = ceiling(length(large_file)/chunk_size)

for (i in 1:n_chunks)
{
  start_byte = ((i - 1) * chunk_size) + 1
  end_byte = start_byte + chunk_size - 1
  if (i == n_chunks)
    end_byte = length(large_file)
  this_chunk = large_file[start_byte:end_byte]
  appendBin(this_chunk, "test.bin") # <-- non-existing magical formula!
}

但我找不到像我上面写的 "appendBin" 或 R 中任何其他文档那样告诉我如何将数据直接附加到磁盘的函数。

所以我的问题归结为:有没有人知道如何追加原始(二进制)数据到已经在磁盘上的文件无需先将磁盘上的完整文件读入内存?

额外的细节:我目前在 Windows 10 PC 和 192GB RAM 上使用 R 版本 3.4.2 64 位。我在另一台 PC 上试过(R 版本 3.5 64 位,Windows 8,内存为 8GB),但遇到了完全相同的问题。

任何类型的见解或解决方法将不胜感激!!!

谢谢!

感谢@MichaelChirico 和@user2554330,我找到了解决方法。本质上,我只需要以 "a+b" 模式打开文件作为新连接并将 该文件连接 提供给 writeBin 函数。

这是工作代码的副本。

large_file = raw(1024 * 1024 * 1024 * 3) 
chunk_size = 1024*1024*512
n_chunks = ceiling(length(large_file)/chunk_size)

if (file.exists("test.bin"))
  file.remove("test.bin")

for (i in 1:n_chunks)
{
  start_byte = ((i - 1) * chunk_size) + 1
  end_byte = start_byte + chunk_size - 1
  if (i == n_chunks)
    end_byte = length(large_file)
  this_chunk = large_file[start_byte:end_byte]
  output_file = file(description="test.bin",open="a+b")
  writeBin(this_chunk, output_file)
  close(output_file)
}

我知道我多次打开和关闭文件很丑陋,但这使得错误不会弹出更大的文件。

再次感谢您的见解,伙计们! =)