mayabot / fastText4j

Implementing Facebook's FastText with java
159 stars 23 forks source link

MAX_VOCAB_SIZE 过大导致java 内存溢出 #14

Closed Alan000 closed 4 years ago

Alan000 commented 5 years ago

你好,代码中的MAX_VOCAB_SIZE = 30000000默认值是否设置过大,当我导入多个fasttext模型的时候就会导致内存溢出(预估了下这个参数大小已经远超物理机内存,而实际模型中的词语数量远达不到这个大小)。有没有什么解决办法,或开放配置参数。

rxy1212 commented 5 years ago

你是不是更改了ngram的值,这个值由默认值1改为其他值的时候会导致模型大接近1000倍

jimichan commented 5 years ago

MAX_VOCAB_SIZE这个和你内存溢出没有直接关系,@rxy1212可能是对的。 每个fasttext模型消息内存的大小和模型文件有关,你导入多个可能导致溢出, 如果是测试环境,你可以把c语言的模型转换为fasttext4j自由的java格式,然后通过内存映射的方式读入模型,只是查询速度会慢

Alan000 commented 5 years ago

ngram值为1,没有动。加载一个或少量模型的时候是不会报错,我这边出错的场景是顺序一次性加载多个(有100多个)已经训练好的fasttext bin模型文件。加载完一部分后就会内存溢出错误,定位错误的位置是在MAX_VOCAB_SIZE这个地方。 单个模型都很小,总模型文件加起来32MB。 kotlin语言不太了解,我的意思是:是不是因为每个模型都申请这么大的内存空间,导致多个模型加载会内存溢出。

jimichan commented 5 years ago

MAX_VOCAB_SIZE这个不可以设置小,因为他是一个hash桶。 另外你这个fasttext模型是用来分类的吗?如果是分类模型,那么你可以使用乘积量化来压缩模型看看。 你这个场景真的很特别,100多个模型?

rxy1212 commented 5 years ago

我也发现了这个问题 当应用中需要同时加载多个模型时 会占用很多内存 我的应用也需要加载19个分类器 每个分类器模型文件很小 但是全部加载就报内存溢出 而且load出来的model不能序列化 想缓存到硬盘都不行

发自我的 iPhone

在 2019年3月7日,22:31,jimi notifications@github.com 写道:

MAX_VOCAB_SIZE这个不可以设置小,因为他是一个hash桶。 另外你这个fasttext模型是用来分类的吗?如果是分类模型,那么你可以使用乘积量化来压缩模型看看。 你这个场景真的很特别,100多个模型?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

jimichan commented 5 years ago

模型是java版本的么,还是c语言版本。我考虑是不是能共用其中的词典部分,来减少内存占用

rxy1212 commented 5 years ago

java版的有这个问题

发自我的 iPhone

在 2019年3月9日,07:39,jimi notifications@github.com 写道:

模型是java版本的么,还是c语言版本。我考虑是不是能共用其中的词典部分,来减少内存占用

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

jimichan commented 4 years ago
<dependency>
  <groupId>com.mayabot.mynlp</groupId>
  <artifactId>fastText4j</artifactId>
  <version>3.1.0</version>
</dependency>

已经修复这个问题,还可以指定这个参数