问题标签 [bytestring]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 字节串直方图
给定一个(严格的)ByteString,计算它包含的每个可能字节的数量最有效的方法是什么?
我认为这sort
应该实现为计数排序 - 但似乎没有一种方法可以访问相关计数。我还看到有一个count
函数,它计算给定字节出现的次数。这给了我以下选项:
map (\ b -> count b str) [0x00 .. 0xFF]
map length . group . sort
- 有
fold*
一个IntMap
字节频率的东西。
哪个可能会给我最好的表现?
haskell - Segfault 读取超过 2^18 个字节的惰性字节串
考虑以下代码:http ://hpaste.org/90394
我正在将一个 460mb 的大文件内存映射到一个惰性字节字符串。ByteString 报告的长度471053056
。
当nxNodeFromID file 110000
更改为较低的节点ID,即:10000
时,它可以正常工作。然而; 一旦我尝试序列化任何超过262144
ByteString 的 2^18 个字节 () 的内容,我就会得到Segmentation fault/access violation in generated code
并终止。
我正在运行 Windows 并使用 GHC 7.4.2。
请告知这是我的错,还是懒惰的问题,或者 Haskell 的问题。
haskell - Haskell:ghci 是否显示“Chunk .. Empty”?
Learn You a Haskell有一个这样的代码示例:
(B
代表Data.ByteString.Lazy
)
但我ghci
没有显示Chunk
和Empty
数据构造函数。
Haskell 开发人员是否改变了ByteString
打印值的方式?
haskell - Haskell ByteString readInt 返回类型问题
我目前正在尝试了解如何使用函数 Data.ByteString.Char8.readInt 处理“Maybe (Int, ByteString)”的返回类型,我已经通过类型检查删除了 Maybe 但不明白如何进一步处理我现在拥有的类型为“(Int,ByteString)”。我觉得我可能遗漏了一些明显的东西,我希望有人能指出我正确的方向。任何帮助表示赞赏!
haskell - 在 Haskell 的 ST Monad 中高效记录字符串数据
我有一个 Haskell 程序,它在 ST monad 内运行期间生成约 280M 的日志记录文本数据。这是几乎所有内存消耗的地方(在禁用日志记录的情况下,程序总共分配了 3MB 实际内存)。
问题是,我的内存用完了。程序运行时内存消耗超过1.5GB,最终在尝试将日志字符串写入文件时耗尽。
日志函数接受一个字符串并将日志数据累积到一个字符串构建器中,该字符串构建器存储在环境中的 STRef 中:
我尝试使用 bang 模式和 modifySTRef' 来引入严格性,但这会使内存消耗更加严重。
我按照 hPutBuilder 文档的建议编写日志字符串,如下所示:
这会消耗几个额外的 GB 内存。我尝试了不同的缓冲设置并首先转换为惰性字节字符串(稍微好一点)。
问:
如何在程序运行时最小化内存消耗?我希望给定一个严格的 ByteString 表示和适当的严格性,我需要的内存比我存储的大约 280M 的实际日志数据多一点。
如何在不分配内存的情况下将结果写入文件?我不明白为什么 Haskell 需要 GB 的内存才能将一些常驻数据流式传输到文件中。
编辑:
这是小运行的内存配置文件(约 42MB 的日志数据)。在禁用日志记录的情况下,总内存使用量为 3MB。
编辑:
我按照要求运行了一个带有小日志运行的内存配置文件:
个人资料 http://imageshack.us/a/img14/9778/6a5o.png
我尝试在相关位置添加爆炸模式、$!、deepseq/$!!、force 等,但似乎没有任何区别。我如何强制 Haskell 实际获取我的字符串 / printf 表达式等并将其放在一个紧凑的 ByteString 中,而不是保留所有那些 [Char] 列表和未评估的 thunk?
编辑:
这是实际的完整跟踪功能
这够“严格”吗?如果我在 ReaderT/ST monad 中调用这个类型类函数,我需要注意什么吗?只是为了它实际上被调用而不是以任何方式延迟。
好吗?
谢谢!
haskell - 为什么创建和处理临时 ByteStrings 会占用我在 Haskell 中的内存?
这是一个创建 1MInt
数字并将它们放在列表中的代码。
(我知道它可能更优化(sum
在 中fold
),但我的观点不同。)看看这个版本
这个版本需要90MB内存!为什么?这是一个分析输出
紫色区域是什么?
编辑 阅读评论后,我想添加一些说明。
这是一个测验。我想在内存中保留 1M 个数字(我正在构建一个查找表)。所以我“想强制将整个列表保存在内存中”。但我不想保留字节串。我的小代码模拟了我从磁盘加载字节串,将其转换为整数并将整数保存在内存中的情况。(这是我的目标)。但不知何故,字节串仍保留在内存中。为什么?
arrays - 在 Haskell 中存储和排序矩形数据的最佳方法是什么?
我有一些 ASCII 文件,总共包含大约 1700 万行,每行/大多数行中有一个固定的 36 字节标识符。所以我的数据是矩形的:我有很多固定宽度的行。使用 Haskell,我想读取所有行,使用正则表达式提取标识符(我很好),然后对它们进行排序并计算唯一标识符的数量(非常接近grep | sort | uniq
)。(我已经通过并行读取每个文件来进行并行化。)听起来像一个简单的问题,但是......
我发现即使在排序阶段之前,也很难从这个问题中获得体面的表现。这是我所知道的。 String
对于 36 字节的 ASCII 来说太过分了,所以我想使用ByteString
. 但是大小为 1700 万的(链接)列表似乎是个坏主意,所以我尝试了IOVector ByteString
. 但这似乎很慢。我相信垃圾收集正在遭受痛苦,因为我在向量中保留了数百万个小字节字符串:GC 花费的时间至少是代码的 3 倍(根据+RTS -s
),我认为随着程序继续运行它只会变得更糟。
我在想我应该使用 Repa 或某种单一的巨型ByteString
// IOVector Char8
whatever(因为我知道每行的确切宽度是 36)为每个线程将数据存储在一个巨大的矩形数组中,这应该可以缓解 GC 问题. 但是,之后我仍然需要对行进行排序,并且 Repa 似乎不支持排序,我不想自己编写排序算法。所以我不知道如何拥有一个巨大的矩形阵列,但仍然对其进行排序。
对要使用的库、要设置的 GC 标志或其他什么的建议?这台机器有 24 个内核和 24GB 的 RAM,所以我不受硬件限制。我想留在 Haskell 中,因为我有很多相关的代码(也用于解析相同的文件并生成摘要统计信息)工作正常,而且我不想重写它。
haskell - 使用 Data.Binary.decodeFile,遇到错误“demandInput: not enough bytes”
我正在尝试使用 Data.Binary 中的 encodeFile 和 decodeFile 函数来保存一个非常大的数据结构,这样我每次运行这个程序时就不必重新计算它。相关的编码和解码功能如下:
计算和写入文件的程序(使用 writePlan)执行没有错误,输出一个巨大的二进制文件。但是,当我运行接收此文件的程序时,执行 readPlan 会导致错误(程序名称为“Realtime”):
我无法确定这一点,并且搜索谷歌并没有发现任何关于此消息的实质性文档或讨论。任何见解将不胜感激!
haskell - Haskell 懒 Bytestring 字不懒?
我有以下 Haskell 程序来计算一串整数的最大和子串:
这个程序的问题在于它将整个文件读入内存。对应的没有BytesString的程序就没有这个问题:
它只使用少量的恒定内存,但当然速度非常慢(大约慢 25 倍)。
该问题仅发生在读取非常大行的程序中。如果输入分布在多条小行上,ByteString 将按预期执行。
有没有办法解决?
haskell - Haskell 在不牺牲性能的情况下避免折叠中的堆栈溢出
以下代码会遇到大输入的堆栈溢出:
我假设我的谓词正在构建一个 thunk 列表,但我不确定为什么或如何修复它。
using 的等效代码foldl'
运行良好,但需要很长时间,因为它不断追加,并使用大量内存。
是什么导致第一个片段建立 thunk,可以避免吗?是否可以编写第二个片段使其不依赖(++)
?