【发布时间】:2013-12-31 17:40:43
【问题描述】:
作为一个名为“beercan”的业余项目,我正在对 Torchlight 游戏的资源文件进行逆向工程。使用正常的十六进制编辑器,我尝试猜测文件的结构,然后对我的想法进行建模,使用cereal 编写Getters(以及后来的一些Putters),并尝试@987654330 @ 库应用程序中的每个文件。
我刚刚开始处理 Torchlight 的编译布局文件(TL1 中的*.LAYOUT,TL2 中的*.LAYOUT.cmp)。结果证明格式比 dat 文件有点棘手,但我想我想出了basic structure 和how they are encoded in the TL2 files。所以我正在尝试制作文件版本、标签号和猜测的数据类型的映射。
为此,我编写了an application 来扁平化数据结构,只留下叶子值的猜测类型,每个都用文件版本以及节点和叶子标记号进行注释。我将其转换为从文件版本和标签号到一组猜测类型的映射。 对于每个文件,我希望这张地图在内存中占用的文件大小可能是文件大小的两倍。(但不确定。)然后,我合并这些地图,然后打印地图。
出于某种原因,即使我只占用 20MB 的文件(100 个文件),内存使用量也会线性增加至大约 200MB,然后减少到生成地图的最终大小,然后在我打印时迅速缩小。
我不希望这样的内存使用。有谁知道我该如何解决?我尝试在解码后强制值(使用 deepseq),我尝试在数据类型中添加 bang,但这并没有真正帮助。我尝试复制我保留在文件结构中的所有字节串,这稍微降低了内存使用量,但它仍然高得令人无法接受,尤其是当我想分析整个数据集(200MB 以上的原始文件)时。
-edit- 我推送了一个(不是很 S)SCCE 来演示性能问题,(不小心)以及我的分析结果。
- 克隆存储库。
-
cabal configure,带有启用分析的标志(需要--enable-library-profiling --enable-executable-profiling --ghc-options="-rtsopts -prof"是否正常?) cabal build-
cd test,然后运行 StressTest.sh。
此脚本尝试加载常规 TL2 布局文件 100 次。在我的机器上,top 说它需要大约 500MB 的内存,并且 profiling 结果与我上面的描述一致。
【问题讨论】:
-
你能发一个SSCCE吗?我们可以运行一段代码,它可以演示内存问题,而无需探索整个应用程序。也许只是一个读取
/dev/zero多次的虚拟解析器或类似的东西。 -
如果有帮助,我提供了一个压力测试用例来演示问题,但如果不发明自己的文件格式,我真的不知道如何解决问题:/
标签: haskell memory-leaks unmarshalling