问题标签 [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.

0 投票
4 回答
235 浏览

haskell - 字节串直方图

给定一个(严格的)ByteString,计算它包含的每个可能字节的数量最有效的方法是什么?

我认为这sort应该实现为计数排序 - 但似乎没有一种方法可以访问相关计数。我还看到有一个count函数,它计算给定字节出现的次数。这给了我以下选项:

  • map (\ b -> count b str) [0x00 .. 0xFF]
  • map length . group . sort
  • fold*一个IntMap字节频率的东西。

哪个可能会给我最好的表现?

0 投票
1 回答
424 浏览

haskell - Segfault 读取超过 2^18 个字节的惰性字节串

考虑以下代码:http ://hpaste.org/90394

我正在将一个 460mb 的大文件内存映射到一个惰性字节字符串。ByteString 报告的长度471053056

nxNodeFromID file 110000更改为较低的节点ID,即:10000时,它可以正常工作。然而; 一旦我尝试序列化任何超过262144ByteString 的 2^18 个字节 () 的内容,我就会得到Segmentation fault/access violation in generated code并终止。

我正在运行 Windows 并使用 GHC 7.4.2。

请告知这是我的错,还是懒惰的问题,或者 Haskell 的问题。

0 投票
2 回答
273 浏览

haskell - Haskell:ghci 是否显示“Chunk .. Empty”?

Learn You a Haskell有一个这样的代码示例:

B代表Data.ByteString.Lazy

但我ghci没有显示ChunkEmpty数据构造函数。

Haskell 开发人员是否改变了ByteString打印值的方式?

0 投票
1 回答
243 浏览

haskell - Haskell ByteString readInt 返回类型问题

我目前正在尝试了解如何使用函数 Data.ByteString.Char8.readInt 处理“Maybe (Int, ByteString)”的返回类型,我已经通过类型检查删除了 Maybe 但不明白如何进一步处理我现在拥有的类型为“(Int,ByteString)”。我觉得我可能遗漏了一些明显的东西,我希望有人能指出我正确的方向。任何帮助表示赞赏!

0 投票
1 回答
460 浏览

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 中调用这个类型类函数,我需要注意什么吗?只是为了它实际上被调用而不是以任何方式延迟。

好吗?

谢谢!

0 投票
2 回答
406 浏览

haskell - 为什么创建和处理临时 ByteStrings 会占用我在 Haskell 中的内存?

这是一个创建 1MInt数字并将它们放在列表中的代码。

(我知道它可能更优化(sum在 中fold),但我的观点不同。)看看这个版本

这个版本需要90MB内存!为什么?这是一个分析输出

创建1M ByteString的内存消耗

紫色区域是什么?

编辑 阅读评论后,我想添加一些说明。

这是一个测验。我想在内存中保留 1M 个数字(我正在构建一个查找表)。所以我“想强制将整个列表保存在内存中”。但我不想保留字节串。我的小代码模拟了我从磁盘加载字节串,将其转换为整数并将整数保存在内存中的情况。(这是我的目标)。但不知何故,字节串仍保留在内存中。为什么?

0 投票
5 回答
449 浏览

arrays - 在 Haskell 中存储和排序矩形数据的最佳方法是什么?

我有一些 ASCII 文件,总共包含大约 1700 万行,每行/大多数行中有一个固定的 36 字节标识符。所以我的数据是矩形的:我有很多固定宽度的行。使用 Haskell,我想读取所有行,使用正则表达式提取标识符(我很好),然后对它们进行排序并计算唯一标识符的数量(非常接近grep | sort | uniq)。(我已经通过并行读取每个文件来进行并行化。)听起来像一个简单的问题,但是......

我发现即使在排序阶段之前,也很难从这个问题中获得体面的表现。这是我所知道的。 String对于 36 字节的 ASCII 来说太过分了,所以我想使用ByteString. 但是大小为 1700 万的(链接)列表似乎是个坏主意,所以我尝试了IOVector ByteString. 但这似乎很慢。我相信垃圾收集正在遭受痛苦,因为我在向量中保留了数百万个小字节字符串:GC 花费的时间至少是代码的 3 倍(根据+RTS -s),我认为随着程序继续运行它只会变得更糟。

我在想我应该使用 Repa 或某种单一的巨型ByteString// IOVector Char8whatever(因为我知道每行的确切宽度是 36)为每个线程将数据存储在一个巨大的矩形数组中,这应该可以缓解 GC 问题. 但是,之后我仍然需要对行进行排序,并且 Repa 似乎不支持排序,我不想自己编写排序算法。所以我不知道如何拥有一个巨大的矩形阵列,但仍然对其进行排序。

对要使用的库、要设置的 GC 标志或其他什么的建议?这台机器有 24 个内核和 24GB 的 RAM,所以我不受硬件限制。我想留在 Haskell 中,因为我有很多相关的代码(也用于解析相同的文件并生成摘要统计信息)工作正常,而且我不想重写它。

0 投票
1 回答
616 浏览

haskell - 使用 Data.Binary.decodeFile,遇到错误“demandInput: not enough bytes”

我正在尝试使用 Data.Binary 中的 encodeFile 和 decodeFile 函数来保存一个非常大的数据结构,这样我每次运行这个程序时就不必重新计算它。相关的编码和解码功能如下:

计算和写入文件的程序(使用 writePlan)执行没有错误,输出一个巨大的二进制文件。但是,当我运行接收此文件的程序时,执行 readPlan 会导致错误(程序名称为“Realtime”):

我无法确定这一点,并且搜索谷歌并没有发现任何关于此消息的实质性文档或讨论。任何见解将不胜感激!

0 投票
2 回答
323 浏览

haskell - Haskell 懒 Bytestring 字不懒?

我有以下 Haskell 程序来计算一串整数的最大和子串:

这个程序的问题在于它将整个文件读入内存。对应的没有BytesString的程序就没有这个问题:

它只使用少量的恒定内存,但当然速度非常慢(大约慢 25 倍)。

该问题仅发生在读取非常大行的程序中。如果输入分布在多条小行上,ByteString 将按预期执行。

有没有办法解决?

0 投票
2 回答
147 浏览

haskell - Haskell 在不牺牲性能的情况下避免折叠中的堆栈溢出

以下代码会遇到大输入的堆栈溢出:

我假设我的谓词正在构建一个 thunk 列表,但我不确定为什么或如何修复它。

using 的等效代码foldl'运行良好,但需要很长时间,因为它不断追加,并使用大量内存。

是什么导致第一个片段建立 thunk,可以避免吗?是否可以编写第二个片段使其不依赖(++)