【问题标题】:Segfault reading lazy bytestring past 2^18 bytesSegfault 读取超过 2^18 个字节的惰性字节串
【发布时间】:2013-06-21 22:30:53
【问题描述】:

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

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

nxNodeFromID file 110000改成较低的节点ID,即:10000,就可以完美运行了。然而;一旦我尝试序列化任何超过 ByteString 的 2^18 字节 (262144) 的内容,我就会得到 Segmentation fault/access violation in generated code 并终止。

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

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

【问题讨论】:

  • 您的 getNXNodeNXNode 数据定义不匹配。如果这是故意的,那将是值得评论的。但我不明白这会如何导致这里出现段错误。
  • 有道理。我想一旦getNXMetadata 完成,它就会或多或少变得明显。
  • 如果您使用mmapFileByteString 而不是mmapFileByteStringLazy,问题是否仍然存在? (您需要将返回的严格 ByteString 包装在 fromChunks [buf] 左右,以获得惰性 ByteString 以供其余代码使用。)
  • 当然,你会失去懒惰。但这个想法是为了暗示问题可能是什么。我怀疑它可能是“-- FIXME:我们可能需要 NOINLINE 编译指示,稍后再调查”(关于 mapChunk handle (offset,size) = unsafePerformIO $),但也可能是别的东西。但是,无法真正调查。 (好吧,如果我必须,我可以启动到 Windows;但我仍然需要一个文件来处理,以及一个很大的动力来让自己暴露在不便中。)
  • 抱歉,这不是我的专业领域。此外,我认为 Windows 核心转储不会与 Linux 上的 gdb 一起使用。你可以尝试联系mmap的维护者,他应该更清楚问题可能是什么。

标签: haskell ghc lazy-evaluation mmap bytestring


【解决方案1】:

请注意,我已更新 mmap 以在代码的关键点正确包含 NOINLINE 杂注。 mmap-0.5.9 可供抓取。让我知道问题是否仍然存在。 编辑:是的,我是 mmap 的作者。

【讨论】:

  • 虽然您似乎是 mmap 的作者,但您的回答并不完全清楚。我会考虑添加更多信息。
  • 您好,我对您的库的最新版本有同样的错误。 stackoverflow.com/questions/53715138/…
猜你喜欢
  • 2018-08-07
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2014-08-22
  • 2011-12-10
  • 2020-09-22
  • 2018-08-24
相关资源
最近更新 更多