1

我在我的 Web 应用程序中使用斯坦福 NER,并使用 english.muc.7class.dissim.crf.ser.gz(16 MB 大小)作为分类器。当我尝试部署和运行我的应用程序时,我得到一个堆空间 - 内存不足加载分类器时出错。

已尝试仅保留有用的代码,还检查代码是否没有创建太多对象并占用空间。但没有成功。

是因为分类器的大小吗?但我想用同样的,我该怎么办?

在 tomcat 中使用 vm 选项增加了本地的堆大小。但是我可以在我将托管我的应用程序的实际服务器上增加 vm 的堆大小,这也不是正确的方法。

有人可以指导我吗?

4

2 回答 2

1

是的,您基本上不应该太担心代码的大小,因为它由加载的数据的大小决定。

模型数据:分类器模型只是占用大量空间。似乎您需要大约 140 MB 的堆来加载当前(2012 年)版本的 english.muc.7class.dissim.crf.ser.gz 。它们只是很多字符串和双精度数,但是磁盘上的大小有很大的增加,因为:磁盘上的数据是压缩的,众所周知,Java 中的 String 对象每个都占用大量空间,而且它们通过占用更多空间的 HashMap 重新链接。似乎单独的 String 数据最终占用了大约 72 MB 的内存(36 MB 的 char[] 数据,36 MB 的 String 对象)。

要分析的数据:这取决于您如何调用它,并且在您使用 tomcat 的情况下可能不是问题,但是如果在文件上运行 NER,它将在分类之前将整个文件读入内存。因此,您可以通过给它多个较小的单元(文件、字符串或其他)进行分类来减少内存。

此外,您更有可能通过标签获得有关此类问题的及时帮助。

于 2013-02-03T17:27:47.237 回答
0

我同意克里斯托弗的建议,你不用担心大小。

但是为了获得强大的性能,请尝试使用永远存在的 Java 线程,并在 serevr 开始时通过静态方法或某个侦听器仅加载一次分类器。然后对于进一步的注释使用相同的上下文。

于 2013-02-09T16:28:51.210 回答