c++ - 在 C++ 中将数据加载到内存中

标签 c++ c++11

我将以下数据存储在 SSD 上的一个文件中(数据大小为 2GB)。我想将此数据加载到内存中,以便给定 Number1 和 Number2,我能够检索与其关联的列表。

Number1  Number2  List(in sorted order. contains maximum 1000 elements)
12       1        5585,5587,5589,5590,5594,5597,5610,5615,5618,5619       
12       2        4561,4789,4980,5001,5008,5010,5100,5150,5240,5250
12       3        3010,3223,3225,3278,3890,4890,5001

13       1        3585,3587,3589,3590,3594,3597,3610,3615,3618,3619       
13       2        14561,14789,14980,15001,15008,15010,15100,15150,15240,15250
13       3        23010,23223,23225,23278,23890,24890,25001

14       1        1585,1587,1589,1590,1594,1597,1610,1615,1618,1619       
14       2        561,789,980,1001,1008,1010,1100,1150,1240,1250
14       3        1010,1223,1225,1278,1890,1891,15001
14       4        4,89,928,3958,95859

我将此数据存储在 std::map<unsigned,std::map<unigned,vector<unsigned>>> 中,作为给定的 Number1 和 Number2 我想检索与其关联的列表。

然而,事实证明,从文件中读取这些数据并将其存储在 64GB 服务器内存中的 std::map<unsigned,std::map<unigned,vector<unsigned>>> 中需要 5 个小时。是否有其他一些我可以使用的数据结构,以便给定 Number1 和 Number2 我可以有效地检索与之关联的列表。此外,数据结构不应花费太多时间来加载此数据。 此外,Number2(给定 Number1)的范围总是从 1 到 10。

我正在使用:g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)

最佳答案

以下是我的建议:

  1. 最好的解决方案确实是将数据存储在数据库中。当公司在过去几十年一直这样做时,实现自己的数据库没有多大意义。只需使用其中之一。如果你真的想让数据完全加载到内存中,你可以使用MySQL的MEMORY引擎:

https://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

  1. 如果 Number1 和 Number2 是整数,那么也许您可以将它们组合成一个 64 位长整数,然后使用它作为您字典中的键。

  2. 在这种情况下使用 std::map 可能会有点慢,因为它在内部实现为自平衡二叉树,所以它的操作是 O(log(n))。如果您可以使用 C++ 11 功能,那么您可以使用以散列形式实现的 STL::unordered_map,因此操作的复杂度为 O(1)。

关于c++ - 在 C++ 中将数据加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30097315/

相关文章:

c++ - 多类型STL映射

c++ - 从 10 以外的其他基数的输入流中读取

c++ - 变量名中的 __COUNTER__

c++ - Emacs 隐藏/显示对 C++ 三斜杠 Doxygen 标记的支持?

c++ - POSIX SIGBUS 的可能原因有哪些?

c++ - 如何重构此类模板以最小化样板代码?

mysql - 在 MySQL 8.0+ 中使用 MySQL 驱动程序在 MySQL 语句中传递 C++ 变量

c++ - 该代码段中是否会发生死锁,为什么?

c# - 模块窗口中缺少一些 DLL

c++ - 使用 lambda 的 Boost 算法无法编译