【发布时间】: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 的问题。
【问题讨论】:
-
您的
getNXNode与NXNode数据定义不匹配。如果这是故意的,那将是值得评论的。但我不明白这会如何导致这里出现段错误。 -
有道理。我想一旦
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