原始(二进制)数据太大而无法写入磁盘。如何按块写入磁盘(追加)?
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)
}
我知道我多次打开和关闭文件很丑陋,但这使得错误不会弹出更大的文件。
再次感谢您的见解,伙计们! =)
我在 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)
}
我知道我多次打开和关闭文件很丑陋,但这使得错误不会弹出更大的文件。
再次感谢您的见解,伙计们! =)