代码抛出std :: bad_alloc,没有足够的内存或者它是一个bug吗?

时间:2010-05-14 02:26:03

标签: c++ memory-management nlp

我正在使用相当大的语法进行解析(1.1 GB,它是面向数据的解析)。据说我使用的解析器(bitpar)针对高度模糊的语法进行了优化。我收到了这个错误:

1terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
dotest.sh: line 11: 16686 Aborted                 bitpar -p -b 1 -s top -u unknownwordsm -w pos.dfsa /tmp/gsyntax.pcfg /tmp/gsyntax.lex arbobanko.test arbobanko.results

有希望吗?这是否意味着内存不足?它在崩溃之前使用大约15 GB。我正在使用的机器有32 GB的RAM,以及交换。它在输出单个解析树之前崩溃;在尝试为第一句话构建图表解析时,我认为它在读完语法后崩溃了。

解析器是一个使用位向量表示的高效CYK图表解析器;我认为它已经非常有效。如果真的需要太多内存,我可以从语法规则中进行抽样,但这会降低解析的准确性。

我认为问题可能是我有非常多的非终端,我应该尝试寻找不同的解析器(任何建议?)

更新:为了后人的缘故,我很久以前就发现了这个问题。由于存在错误,语法太大了,因此解析器无法使用可用内存来处理它。使用正确的语法(小一个数量级),它可以正常工作。

2 个答案:

答案 0 :(得分:4)

内存可能会碎片化。这意味着你的程序可能无法分配1KB,即使17 GB的内存是免费的,当这些17GB被分成3400万个空闲块,每个512字节时。

当然,您的程序可能会错误地计算内存分配。一个常见的错误是尝试分配-1个字节的内存。由于内存大小始终为正,因此将其解释为size_t(-1)超过32 GB。但实际上并没有哪个方向指向这个方向。

要解决这个问题,你需要一个会说C ++的人。如果它确实是内存碎片,那么优秀的C ++程序员可以根据您的特定需求定制内存分配策略。一些策略包括将相同大小的对象保持在一起,并用垫片替换字符串。

答案 1 :(得分:0)

如果您的应用程序使用32位内存模型,那么每个进程将获得4GB的虚拟地址空间。其中只有2G可用于用户空间。

我怀疑你的解析器可能会尝试分配超过可用的虚拟内存。 我不确定Parser是否提供自定义内存分配机制。如果是这样,您可以尝试使用内存映射文件进行分配,并仅在需要时将其置于memroy。