我正在寻找一种在内存中存储几个gb数据的方法。数据被加载到树结构中。我希望能够通过我的main函数访问这些数据,但是每次运行程序时我都不想将数据重新加载到树中。做这个的最好方式是什么?我应该创建一个单独的程序来加载数据,然后从main函数调用它,还是有更好的选择?
感谢 MADS
答案 0 :(得分:6)
我认为最好的替代方案是使用数据库 - 这将是您的“用于加载数据的单独程序”。
答案 1 :(得分:5)
如果您使用的是POSIX兼容系统,请查看mmap。
我认为Windows还有另一种内存映射文件的功能。
答案 2 :(得分:3)
你可以使用shared memory解决这个问题,让一个长期存在的进程构建树并为其公开地址,然后启动的其他进程可以获取相同的内存进行查询。请注意,在这种情况下,您需要确保树由多个同时进程读取。如果读取实际上只是纯读取,那么这应该很容易。
答案 3 :(得分:3)
您应该研究一种名为Memory mapped file的技术。
答案 4 :(得分:1)
我认为最好的解决方案是配置缓存服务器并将数据放在那里。
查看Ehcache:
Ehcache是一个开源的,基于标准的缓存,用于提升 性能,卸载数据库并简化可伸缩性。 Ehcache是 强大,经过验证和功能齐全,这使它成为最多 广泛使用的基于Java的缓存。
它是用Java编写的,但是should support any language you choose:
高速缓存服务器有两个api:面向RESTful资源和SOAP。 两者都支持任何编程语言的客户端。
答案 5 :(得分:0)
您必须运行64位系统才能使用超过4 GB的内存。如果构建树并将其设置为全局变量,则可以从程序中的任何函数访问树和数据。我建议你也许尝试一种需要更少内存消耗的替代方法。如果你发布了什么类型的程序,以及你正在做什么类型的树,我或许可以帮助你寻找替代方法。
由于你不想继续重新加载数据......文件存储和数据库都是不可能的,但几次内存看起来像是一个巨大的代价。
另请注意,在Windows系统上,您可以使用ReadProcessMemory()访问另一个程序的内存,您只需要一个指针来指示内存的位置。
答案 6 :(得分:0)
您也可以将数据加载器实现为可执行程序,将主程序实现为按需加载和卸载的DLL。这样,您就可以将数据保存在内存中,并且无需重新加载所有数据或进行跨进程内存共享即可修改处理代码。
另外,如果您可以对磁盘上的原始数据进行操作而不进行任何预处理(例如将其放在树中,操作指向其内部的指针),您可能需要对数据进行内存映射并避免加载它的未使用部分。