我在我的网络应用程序中使用Stanford NER,并使用english.muc.7class.distsim.crf.ser.gz(16 MB大小)作为分类器。当我尝试部署并运行我的应用程序时,我获得了堆空间 - 加载分类器时出现内存不足错误。
如果代码没有创建太多对象并占用空间,那么还是尝试保留有用的代码。但没有成功。
是因为分类器的大小?但我想使用相同的,所以我该怎么办?
使用tomcat中的vm选项增加了本地的堆大小。但是我可以在我将托管应用程序的实际服务器上增加vm的堆大小,这也不是正确的方法。
任何人都可以指导我吗?
答案 0 :(得分:1)
是的,你基本上不应该担心代码的大小,因为它主要是加载数据的大小。
模型数据:分类器模型占用了大量空间。看起来你需要一个大约140 MB的堆来加载当前(2012)版本的english.muc.7class.distsim.crf.ser.gz。它们只是很多字符串和双打,但是磁盘上的大小有很大的增加,因为:磁盘数据被压缩,众所周知,java中的String对象每个都采用巨大的空间量,它们通过HashMap链接,占用更多空间。似乎单独的String数据最终占用了大约72 MB的内存(36 MB的char []数据,36 MB的String对象)。
要分析的数据:这取决于你如何调用它,在使用tomcat的情况下可能不是问题,但是如果在文件上运行NER,它将在分类之前将整个文件读入内存。因此,您可以通过为其分类多个较小的单位(文件,字符串或其他)来减少内存。
此外,您更有可能通过标记stanford-nlp获得有关此类问题的快速帮助。
答案 1 :(得分:0)
我同意克里斯托弗的建议,你不用担心它的大小。
但是为了获得强大的性能,请尝试使用永远存在的Java线程,并通过静态方法或某些侦听器在serevr的开头只加载一次分类器。然后进一步注释使用相同的上下文。