如何在 Clojure 中处理大型二进制数据?

2024-04-17

如何在 Clojure 中处理大型二进制数据文件?我们假设数据/文件大约为 50MB - 小到足以在内存中处理(但不是简单的实现)。

以下代码正确地从小文件中删除 ^M 但它会抛出OutOfMemoryError对于较大的文件(如 6MB):

(defn read-bin-file [file]
  (to-byte-array (as-file file)))

(defn remove-cr-from-file [file]
  (let [dirty-bytes (read-bin-file file)
        clean-bytes (filter #(not (= 13 %)) dirty-bytes)
        changed?    (< (count clean-bytes) (alength dirty-bytes))]    ; OutOfMemoryError
    (if changed?
      (write-bin-file file clean-bytes))))    ; writing works fine

看起来Java字节数组不能被视为seq因为它的效率极低。

另一方面,解决方案aset, aget and areduce臃肿、丑陋且势在必行,因为您无法真正使用 Clojure 序列库。

我缺少什么?如何在 Clojure 中处理大型二进制数据文件?


我个人可能会在这里使用 aget / aset / areduce - 它们可能是必要的,但在处理数组时它们是有用的工具,而且我不认为它们特别难看。如果你想将它们包装在一个好的函数中,那么你当然可以:-)

如果您决定使用序列,那么您的问题将在于 seq 的构造和遍历,因为这将需要为数组中的每个字节创建和存储一个新的 seq 对象。每个数组字节可能约为 24 个字节……

因此,诀窍是让它惰性地工作,在这种情况下,在到达数组末尾之前,较早的对象将被垃圾收集。然而,为了使其工作,您必须避免在遍历序列时(例如使用 count)保留对 seq 头部的任何引用。

以下可能有效(未经测试),但取决于以惰性友好方式实现的 write-bin-file:

(defn remove-cr-from-file [file]
  (let [dirty-bytes (read-bin-file file)
        clean-bytes (filter #(not (= 13 %)) dirty-bytes)
        changed-bytes (count (filter #(not (= 13 %)) dirty-bytes))
        changed?    (< changed-bytes (alength dirty-bytes))]   
    (if changed?
      (write-bin-file file clean-bytes))))

请注意,这本质上与您的代码相同,但构造了一个单独的惰性序列来计算更改的字节数。

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

如何在 Clojure 中处理大型二进制数据? 的相关文章

随机推荐

  • JsonValueProviderFactory 抛出“请求太大”

    我收到一个异常 即 JSON 请求太大而无法反序列化 它来自 JsonValueProviderFactory MVC 应用程序当前有一个使用 Json Net 的自定义模型绑定器 它在反序列化 json 数据时没有问题 但是我假设默认的
  • 什么是 AsyncManager.OutstandingOperations?

    感谢 MSDN 他们没有对此进行任何解释 http msdn microsoft com en us library system web mvc async asyncmanager outstandingoperations v vs
  • 如何使用 JavaSound (Java, Java Sound) 从 .wave 文件读取信息

    您好 我需要从 wave 文件中读取采样率 信号频率和幅度 我怎样才能使用 JavaSound 做到这一点 您可以通过获取句柄来获取采样率AudioFormat object AudioInputStream audioInputStrea
  • Phonegap + jQuery Mobile + 股票/折线图

    我试图找到一个在phonegap应用程序中绘制折线 股票图表的解决方案 我尝试过很多库 amcharts JS highcharts 但没有一个能工作 有人可以帮我完成这项任务吗 欢迎任何解决方案 平台 Android iOS 我有同样的问
  • 通过电子邮件询问评级

    在我的应用程序中 我们将通过向用户发送电子邮件来获取反馈 因此 如果用户填写字段并提交 那么我会将其存储在我的数据库中 我准备了一封 html 邮件 如下所示 但这里的问题是我无法在邮件中显示评级星星 这需要内联 css 但我无法将该 cs
  • AdMob 横幅不适用于移动数据

    我最近开始开发 Android 应用程序 当尝试在我的应用程序中加载横幅时 我在 logcat 中收到以下错误 03 02 17 30 58 509 I Ads 12181 Use AdRequest Builder addTestDevi
  • 给出源时,Django Rest Framework Serializer charfield 不更新

    我有一个带有选择 charfield 的模型字段 class Vehicle models Model name models CharField max length 100 STATUS CHOICES N New U Used P J
  • 如何在 Visual Studio Code 中更新 C# 版本?

    我已经安装了 C 扩展 我的 NET 框架已更新 但我无法修复它 我已经找到了修复方法 希望这对将来的人有所帮助 找你的 csproj file 将 LangVersion 属性更改为所需版本
  • AMD64 ABI 中的空类会发生什么情况?

    我正在看AMD64 ABI http www cs tufts edu comp 40 readings amd64 abi pdf并且它似乎没有指定如何传递空类类型 对于空类成员函数 似乎this照常传递 但对于空类 Clang 生成的代
  • RcppEigen - 从包中的内联函数到 .cpp 函数和“Map”

    一切似乎都在我的包中工作 但我想检查其步骤是否正确以及使用 Map 的内存使用情况 这是一个简单的示例 位于内联示例和fastLm 例子 这是一个内联函数 它取矩阵每一列的最大值 library Rcpp library inline li
  • 如何将 long (currentTimeInMillis) 转换为 UTC 时间戳?

    我的客户正在向我发送Long这可以被认为是 scala gt System currentTimeMillis res3 Long 1441056836609 scala gt 我如何将其转换为UTC时间戳 在服务器上 我们使用Java 8
  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • 在 Eclipse 中编辑代码时如何禁用粗体字体?

    我不希望 Eclipse 以粗体显示任何关键字 我浏览了 首选项 窗口中的很多选项 但找不到执行此操作的方法 是否可以 这取决于您正在编辑的文件类型 例如 在 Java 中 窗口菜单 gt 首选项 gt Jave gt 编辑器 gt 语法着
  • Java反应式框架的比较[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我看到许多框架 库声称它们可以帮助用 Java 构建响应式应用程序 例如 Akka Vert x RxJava Reactor QBit 等 他
  • 如何将 activemq-core.xsd url 与 jar 文件中找到的 activemq.xsd 关联?

    有人知道如何关联activemq core xsd网址与activemq xsd在 jar 文件 activemq core 5 2 0 jar 中找到 我在互联网上找到了一些解决方案 但没有成功 我收到此错误 Caused by org
  • 如何在 Rails 中保守 Secrets.yml 的秘密?

    我对 Rails 还很陌生 但我有一些 PHP 和其他语言编程经验 我真的很喜欢 Rails 并且正在为我的公司开发一个应用程序 但我仍然不完全理解 Secrets yml 文件如何与 git 和 heroku 配合使用 我知道秘密用于身份
  • Swiper 在 Jquery Mobile 中不起作用

    我在用idangero us 的 Swiper http www idangero us sliders swiper index php使用 Jquery 移动 我在这里使用滚动容器滑动器对于内容滑块 只是面临着将代码嵌入在一起的很多问题
  • rake db:rollback 为什么要回滚三步?

    通常当我这样做时 rake db rollback 它会回滚一次迁移 但现在 反复多次 已经回退了3步 怎么会有这种行为呢 我使用的是 Rails 3 2 13 您可以像这样指定步骤数 rake db rollback STEP 3 The
  • 如何更改Cloud Functions部署中使用的bundler版本?

    Context 从几天前开始 云功能的部署一直失败 Gemfile source https rubygems org ruby gt 2 7 0 git source github repo name https github com r
  • 如何在 Clojure 中处理大型二进制数据?

    如何在 Clojure 中处理大型二进制数据文件 我们假设数据 文件大约为 50MB 小到足以在内存中处理 但不是简单的实现 以下代码正确地从小文件中删除 M 但它会抛出OutOfMemoryError对于较大的文件 如 6MB defn