我在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)并遇到了完全相同的问题。
非常感谢任何形式的见解或解决方法!!!
谢谢!
答案 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)
}
我知道我多次打开和关闭文件很难看,但这样可以防止错误弹出更大的文件。
再次感谢您的见解,伙计们! =)