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

2024-04-12

我在 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 文档来告诉我如何将数据直接附加到磁盘。

所以我的问题归结为:有谁知道如何append原始(二进制)数据到文件已经开启磁盘而不必先将磁盘上的完整文件读取到内存?

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

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

谢谢你!


感谢@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)
}

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原始(二进制)数据太大而无法写入磁盘。如何按块写入磁盘(附加)? 的相关文章

随机推荐

  • 任何免费的 UPC/条形码 DB [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 Windows 身份验证可以从本地到服务器工作,但不能从服务器到服务器工作?

    我有两个网站 A and B A使用一个 APIB暴露 并且B需要 Windows 身份验证 两个站点都位于域中D API 通过以下方式使用HttpClient 以及当站点A在我的域帐户下本地运行 位于 DomainP 访问被授予 在这种情
  • Webdriver (c#) - 大概通过文本查找按钮

    我正在努力抓住按钮 有人能向我指出如何获取按钮句柄并使用 xpath 或 css 选择器单击它的正确方向吗 这是代码
  • 将字符串转换为静态字符串

    Swift 3 0 有没有办法获得StaticString键入一个String类型哪个复杂 示例 需要转换才能工作 let aString StaticString One part Second part 这是不可能的 因为StaticS
  • 在 Swift 中解码 JSON 中的 base64_encode 图像

    我有一个 mysql 数据库 其中包含一些图像 我从 php 文件接收数据 php result key image based64 encode resultArray key image 现在有了 Json 文件 我得到如下内容 Jso
  • 如何在CSS中绘制可配置的饼图

    从链接http www kylejlarson com blog 2011 how to create pie charts with css3 http www kylejlarson com blog 2011 how to creat
  • 切片 Pandas 时出现值错误

    我有一个 DataFrame 我想使用 string contains 方法 我相信当我阅读时我已经找到了如何做到这一点pandas dataframe 按部分字符串选择 https stackoverflow com questions
  • android:如何检查应用程序是否在后台运行2

    我有解决办法 public static boolean isApplicationSentToBackground final Context context ActivityManager am ActivityManager cont
  • 如何使用expo文件系统保存图库中的二维码

    我正在使用 expo 开发一个 React Native 项目 它包括创建一个二维码 我已经完成了 将二维码转换为图像 然后将其保存到图库 我想将 QR 码转换为图像 然后将其保存到我的图库中或共享 在下面给出的代码中 在编译时会出现错误
  • C++ 将基础对象类型转换为派生对象

    所以我有一个动态分配的基类数组 我在数组中存储了其派生类的一些对象 学生 基 类及其派生类都有一个getInfo 函数 显然派生类已经覆盖了该基类getInfo 目标是使用getinfo从基类中获取函数 然后将派生类的两个对象键入类 返回派
  • LINQ Count ..最好的方法

    我的公司刚刚开始使用 LINQ 但我仍然对 LINQ 命令和 SQL 的抽象性 如果这是一个词的话 有一些疑问 我的问题是 Dim query From o In data Addresses Select o Name Count 在我看
  • 错误:参数类型不兼容

    我正在用 C 写一个列表 以下是来源 include
  • Android Volley 库无法处理 204 和空主体响应

    我正在使用最新的 Volley 库 当我的 api 返回 204 且响应中没有正文时 我遇到了问题 BasicNetwork java 中的以下代码似乎未按预期工作 Some responses such as 204s do not ha
  • 在 junit 中模拟 System.getenv 调用时遇到问题

    我正在尝试使用 junit 和mockito 对此非常新 为 Spring Boot 应用程序编写单元测试 基本上在我的代码中 我已经为 manifest yml 文件 用于部署 中的特定 URL 指定了一个环境变量 我可以通过它访问Str
  • Object.assign 未按预期工作

    我有一个名为 bookings 的对象 其中有几个属性 我想使用 Object assign 进行扩展 如下所示 let data Object assign booking hiw event hiw booking locale tip
  • 如何在启用视觉样式的情况下将控件渲染为看起来像 ComboBox?

    我有一个模仿的控件ComboBox 我想渲染该控件以便该控件border看起来像标准的Windows 组合框 具体来说 我遵循了 MSDN 文档 除了禁用控件时的渲染之外 所有控件的渲染都是正确的 需要明确的是 这是针对具有视觉风格已启用
  • ASP .NET 单例

    只是想确保我在这里没有假设一些愚蠢的事情 在 ASP Net Web 应用程序中实现单例模式时 静态变量范围仅适用于当前用户会话 对吧 如果第二个用户正在访问该站点 那么它是不同的内存范围 静态成员仅具有当前工作进程的作用域 因此与用户无关
  • 为什么 LINQPad 将枚举整数值转储为字符串?

    我使用 LinqPad 来测试一些 Enum 函数 但在使用 Dump 时没有得到像我预期的整数 为什么 ToList 解决了这个问题 void Main Enum GetValues typeof Options Cast
  • Gas 与 nasm:哪个汇编器生成最好的代码?

    这两种工具都将汇编指令直接翻译成机器代码 但是是否有可能确定哪一个生成最快 最干净的代码 当你用汇编程序编写时 您正在准确地描述生成的指令所以它不依赖于汇编器 这取决于你 您编写的助记符与机器代码中的实际指令之间存在一一对应的关系
  • 原始(二进制)数据太大而无法写入磁盘。如何按块写入磁盘(附加)?

    我在 R 中有一个很大的原始向量 即二进制数据数组 我想将其写入磁盘 但我收到一条错误消息 告诉我该向量太大 这是一个可重现的示例和我收到的错误 gt writeBin raw 1024 1024 1024 2 test bin Error