我将以下数据存储在 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)
最佳答案
以下是我的建议:
- 最好的解决方案确实是将数据存储在数据库中。当公司在过去几十年一直这样做时,实现自己的数据库没有多大意义。只需使用其中之一。如果你真的想让数据完全加载到内存中,你可以使用MySQL的MEMORY引擎:
https://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html
如果 Number1 和 Number2 是整数,那么也许您可以将它们组合成一个 64 位长整数,然后使用它作为您字典中的键。
在这种情况下使用 std::map 可能会有点慢,因为它在内部实现为自平衡二叉树,所以它的操作是 O(log(n))。如果您可以使用 C++ 11 功能,那么您可以使用以散列形式实现的 STL::unordered_map,因此操作的复杂度为 O(1)。
关于c++ - 在 C++ 中将数据加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30097315/