Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用大量内存的MongoDB_Java_Mongodb_Memory Management_Morphia - Fatal编程技术网

Java 使用大量内存的MongoDB

Java 使用大量内存的MongoDB,java,mongodb,memory-management,morphia,Java,Mongodb,Memory Management,Morphia,我正在尝试将mysql表迁移到mongodb。我的表有600万个条目。我正在使用java和morphia。当我节省大约120万时,我的记忆几乎被消耗殆尽 我读到mongo将数据存储在内存中,然后保存到磁盘中。是否可以发送诸如提交之类的消息来释放一些内存?1)就持久性而言,您可以告诉MongoDB java驱动程序(Morphia正在使用哪个驱动程序),使用哪个策略,请参阅。这只是速度之间的折衷:NONE(甚至连连接问题都不会导致错误)直到FSYNC\u SAFE(数据肯定会写入磁盘)。 有关内部

我正在尝试将mysql表迁移到mongodb。我的表有600万个条目。我正在使用java和morphia。当我节省大约120万时,我的记忆几乎被消耗殆尽

我读到mongo将数据存储在内存中,然后保存到磁盘中。是否可以发送诸如提交之类的消息来释放一些内存?

1)就持久性而言,您可以告诉MongoDB java驱动程序(Morphia正在使用哪个驱动程序),使用哪个策略,请参阅。这只是速度之间的折衷:
NONE
(甚至连连接问题都不会导致错误)直到
FSYNC\u SAFE
(数据肯定会写入磁盘)。 有关内部详细信息,请查看

2) 您的整个数据都映射到内存(这就是为什么32位版本的大小限制为2GB),但它仅在需要时才实际加载。MongoDB通过使用mmap将其留给操作系统。因此,只要有更多的RAM可用,MongoDB就会很高兴地将它需要的所有数据加载到RAM中,以使查询非常快速。如果没有更多可用内存,则由操作系统来替换旧的内存。这有一个很好的效果,即即使重新启动MongoDB进程,您的数据也将保留在内存中;只有在重新启动服务器时,才必须再次从磁盘提取数据。我认为不利的一面是,与操作系统相比,数据库进程可能对应该首先交换的内容有更好的理解。 我没有在Windows上使用MongoDB,也没有在Mac或Linux上看到这条消息,但操作系统应该为您处理这条消息(并根据需要自动交换信息)。您是否尝试过将驱动程序设置为“日志安全”(JOURNAL_SAFE)模式(应该是数据安全和速度之间的一个很好的折衷方案)?在该设置中,即使MongoDB进程死亡,也不应丢失任何数据


3) 一般来说,MongoDB是为了使用尽可能多的可用内存而构建的,但您可能可以限制它,因为我们使用的是(虚拟)Linux服务器。如果您只想释放MongoDB使用的一些内存,在处理完数据且mongod空闲后,您可以运行此命令

use admin
db.runCommand({closeAllDatabases: 1})
然后,您将看到
mongostat
输出的映射、vsize、res下降了很多


我试过了,效果不错。希望对您有所帮助,mongodb使用了多少内存?我不觉得它会占用很多不需要的内存。通常是需要缓存在内存中的数据和索引占用了最多的内存。我的PC机有6gb,当a启动进程时,我使用的内存约为1.5gb。150万条记录之后,使用的内存为580GB。我正在使用windows,这次操作系统弹出窗口告诉我,某些进程占用了大量内存,必须关闭,否则数据将丢失。coll名称未压缩,因此使用userdata.timestampuser或userdata.longnameforfield等名称不是最佳选择。尝试更改名称eq timestamp use ts、user_id=>ui或UID,这显然取决于文档结构。为1KB的字符串使用20个字符的名称不会有太大的区别。使用长名称来存储布尔值显然可以;-)。我仍然希望有一些内部的重新映射,这可以解决这个问题…谁的内存和Cpu的限制是可怕的我需要尝试:)这个命令是为内部测试只,并已在较新的版本中删除,你可以看到这里。()