- 主题:能用 mmap 来省点内存吗?
我有个程序往内存里面加载了大量的数据 (8G+),以供外部服务器使用。
每一段数据都有差不多的概率被访问到。访问的频率中等,不是特别热的数据。既有读取与有写入,但写入相对比较少。
如果每次都从文件中加载的话,反序列化很占用 CPU 时间。放在内存里面又太占用 VPS 内存,云服务器的内存很贵。
是不是可以用 mmap 优化一下?我创建一个 32G 大小的文件,然后用 mmap() 映射到内存里面,把这些数据放在映射内存里面?
这样做的话,操作系统会在物理内存不足的时候自动地把映射的页扔掉吧?等需要读取到的时候再重新从磁盘加载?减少 OOM 的机会?
--
FROM 117.24.95.*
你这样需要开启memory overcommit吧?
【 在 hgoldfish 的大作中提到: 】
: 我有个程序往内存里面加载了大量的数据 (8G+),以供外部服务器使用。
: 每一段数据都有差不多的概率被访问到。访问的频率中等,不是特别热的数据。既有读取与有写入,但写入相对比较少。
: 如果每次都从文件中加载的话,反序列化很占用 CPU 时间。放在内存里面又太占用 VPS 内存,云服务器的内存很贵。
: ...................
--
FROM 222.71.112.*
不需要的
【 在 JulyClyde 的大作中提到: 】
: 你这样需要开启memory overcommit吧?
--
FROM 116.213.168.*
memory overcommit 现在各发行版都是默认开启的吧?
【 在 JulyClyde 的大作中提到: 】
: 你这样需要开启memory overcommit吧?
--
FROM 117.24.95.*
应该是开的
但是你这个比例是不是有点过分啊?我不知道能不能成功啊
要不你先去试试然后来开坛说法
【 在 hgoldfish 的大作中提到: 】
: memory overcommit 现在各发行版都是默认开启的吧?
--
FROM 139.227.19.*
open/read/write 的干净内存页也会自动 drop 掉啊
【 在 hgoldfish 的大作中提到: 】
: 我有个程序往内存里面加载了大量的数据 (8G+),以供外部服务器使用。
: 每一段数据都有差不多的概率被访问到。访问的频率中等,不是特别热的数据。既有读取与有写入,但写入相对比较少。
: 如果每次都从文件中加载的话,反序列化很占用 CPU 时间。放在内存里面又太占用 VPS 内存,云服务器的内存很贵。
: ...................
--
FROM 220.181.41.*
用 read/write 需要序列化,而且有内存复制。用 mmap() 效率比 read/write 更高。
【 在 zylthinking2 的大作中提到: 】
: open/read/write 的干净内存页也会自动 drop 掉啊
--
FROM 117.24.95.*
这是另一个问题, 你说的能不能省内存, 而不是性能高低;
事实上, 对于顺序读写, mmap 性能并比 read/write 高
【 在 hgoldfish 的大作中提到: 】
: 用 read/write 需要序列化,而且有内存复制。用 mmap() 效率比 read/write 更高。
:
--
FROM 220.181.41.*
我想折衷一下,read/write 需要序列化和多次内存复制,内存池也不太可能是顺序读写,所以性能肯定比 mmap() 更慢。虽然能够减少很多内存占用。但我还是希望用 mmap() 达到内存占用和性能之间的平衡。毕竟我这个应用场景,并不是完全不考虑性能。
【 在 zylthinking2 的大作中提到: 】
: 这是另一个问题, 你说的能不能省内存, 而不是性能高低;
: 事实上, 对于顺序读写, mmap 性能并比 read/write 高
--
FROM 117.24.95.*
省内存和性能高低应该都涉及啊
序列化耗时可以节省掉(后使用的一方直接把struct*指到那个地址上就可以了)
内存复制耗时可以节省掉(不需要跨进程通信,所以不需要复制)
内存使用量可以节省掉(只有一份)
【 在 zylthinking2 的大作中提到: 】
: 这是另一个问题, 你说的能不能省内存, 而不是性能高低;
: 事实上, 对于顺序读写, mmap 性能并比 read/write 高
--
FROM 222.71.112.*