2011-09-30 91 views
2

我正在寻找一种方法在内存中存储数GB的数据。数据被加载到树形结构中。我希望能够通过我的主要功能访问这些数据,但是我没有兴趣在每次运行程序时将数据重新加载到树中。做这个的最好方式是什么?我应该创建一个单独的程序来加载数据,然后从主函数中调用它,还是有更好的选择?将大量的数据存储在内存中

感谢 的Mads

回答

6

我想说的最佳替代品将使用一个数据库 - 这将是那么你的“加载数据独立程序”。

5

如果您使用的是POSIX兼容系统,请查看mmap

我认为Windows有另一个功能来存储映射文件。

+1

“如果你使用的是Linux”:'mmap()的'是POSIX,而不是只有Linux:http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html – Raedwald

3

你或许可以使用shared memory来解决这个问题,让它有一个长期存在的进程构建树并为其提供地址,然后其他启动的进程可以获得同样的查询内存。请注意,在这种情况下,您需要确保树正由多个同时进程读取。如果读数真的只是纯读数,那么这应该很容易。

+2

此。 (或者,使用索引而不是指针并将树存储在磁盘上的映射文件中)。 – Damon

+0

小心从树结构寻址共享内存中的指针。共享内存内容具有相对寻址,因此,遍历树指针会导致程序崩溃。为此,Boost有一个特殊的偏移指针。 –

0

您必须运行64位系统才能使用超过4 GB的内存。如果您构建树并将其设置为全局变量,则可以从程序中的任何函数访问树和数据。我建议你也许尝试一种需要更少内存消耗的替代方法。如果你发布什么类型的程序,以及你正在做什么类型的树,我可以给你一些帮助找到一种替代方法。

既然你不想继续重新加载数据......文件存储和数据库是没有问题的,但几个内存的演出似乎是这样一个沉重的代价。

另请注意,在Windows系统上,您可以使用ReadProcessMemory()访问另一个程序的内存,您只需要一个指针用于存储器的位置。

+0

两个小小的注意事项:在32位Windows下映射的限制在1.3到1.4GB的正常启动(2.3到2.4GB与/ 3G和LARGEADDRESSAWARE标志),而不是4GB左右。另外,ReadProcessMemory是一种memcpy(在进程之间),所以它不太可能会用到。开销将是禁止的。 – Damon

3

你应该看看一种叫做Memory mapped file的技术。

+0

+1是最简单的解决方案之一,它也支持比RAM更大的数据。 –

0

你也可以实现数据加载器作为一个可执行程序和主程序作为一个DLL加载和卸载的需求。这样您就可以将数据保存在内存中,并且可以修改处理代码而无需重新加载所有数据或进行跨进程内存共享。另外,如果您可以对磁盘上的原始数据进行操作(而不是对其进行任何预处理(例如,将其放入树中,操作指向其内部的指针),则可能需要对数据进行内存映射,避免加载未使用的部分。

1

我认为最好的解决方案是配置缓存服务器并将数据放在那里。

查找到Ehcache

的Ehcache是​​用来提高性能 ,卸载数据库,并简化可扩展性的开源的,基于标准的高速缓存。 Ehcache是​​ 强大,成熟和功能全面的,这使它成为最广泛使用的基于Java的高速缓存 。

它是用Java编写的,但should support any language you choose

缓存服务器有两个API:REST的资源导向,SOAP。 两者都支持任何编程语言的客户端。

+0

适用于开源解决方案。 – Rob