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

时间:2018-05-11 17:18:59

标签: r memory binary large-files

我在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中的任何其他文档,告诉我如何将数据直接附加到磁盘。

所以我的问题归结为:有没有人知道如何追加原始(二进制)数据到已经在磁盘上而不必阅读完整文件磁盘到内存第一?

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

非常感谢任何形式的见解或解决方法!!!

谢谢!

1 个答案:

答案 0 :(得分:2)

感谢@MichaelChirico和@ user2554330,我能够找到解决方法。基本上,我只需要在&#34; a + b&#34;中打开文件。 mode作为新连接,并将该文件连接提供给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)
}

我知道我多次打开和关闭文件很难看,但这样可以防止错误弹出更大的文件。

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