在进程内存中缓存大量数据

时间:2011-07-12 17:59:22

标签: c++

我在金融业工作。我们想推出数据库命中数据处理。这是非常昂贵的。所以我们计划采用按需缓存逻辑。 [运行时插入&运行时查找]

是否有人在超过1000万条记录中实施缓存逻辑?每条记录大约是160 - 200字节。

我用不同的方法面对以下缺点。

  1. 无法使用 stl std :: map 来实现密钥库缓存注册表。 200000条记录后插入和查找非常慢。
  2. 共享内存或内存映射文件是缓存数据的开销, 因为这些数据不是在整个过程中共享的
  3. 使用 sqlite3 in-memory& flatfile应用程序数据库即可 价值。但在2-3百万条记录之后,它的查找速度也很慢。
  4. 进程内存可能对自己的内核内存消耗有一些限制。我的 假设是32位机器上的2演出&在64位机器上进行4演出。
  5. 如果您遇到过这个问题并以任何方式解决了,请建议我。

    由于

3 个答案:

答案 0 :(得分:1)

如果您的缓存是一个简单的键值存储,则不应该使用std::map,它具有 O (log n )查找,但{ {1}},其中 O (1)查找。如果您需要排序,则应该只使用std::unordered_map

听起来好像是你所追求的,所以你可能想看看Boost Intrusive。您可以轻松地将std::mapunordered_map组合在一起以创建高效LRU。

答案 1 :(得分:0)

将所有内容读入内存并创建R& B树以进行密钥访问。

http://www.mit.edu/~emin/source_code/cpp_trees/index.html

在最近的一个项目中,我们拥有大约10个M记录的数据库,并且正在使用这样的策略。

您的数据重量为2GB,来自您的帖子。随着开销,它会说达到两倍。任何64位架构都没问题。

答案 2 :(得分:0)

我最近更改了产品(3D医疗卷查看器)的内存分配,以使用良好的旧内存映射文件。

优点是:

  • 如果我愿意,我可以分配所有物理RAM(我的32位应用程序有时需要64位机器上的4 gig以上)
  • 如果您只映射部分,则您的地址空间可供您的应用程序免费使用,从而提高可靠性。
  • 如果你的内存耗尽,事情会变慢,不会崩溃。

在我的情况下,它只是数据(主要是只读)。如果您有一个更复杂的数据结构,这将比使用“普通”对象更多的工作。

您实际上可以跨进程共享这些进程(如果它们由真实文件支持)。这可能有不同的表现,我对此没有经验。