我有一个程序,它接收一个只是一个集合列表的文件,每个集合都有自己的整数标识符,然后按成员数量对这些集合进行排序。
文件格式(R之后的数字是ID):
R1
0123
0000
R2
0321
R3
0002
...
struct CodeBook {
string Residue; //stores the R lines
vector<string> CodeWords; //stores the lines between the R lines
};
vector<CodeBook> DATA;
对于我运行的每个文件,集合的数量变大,目前我只是将所有内容存储到巨大的向量DATA中。我的最新文件足够大,我已经接管了服务器的内存并流入交换机。这将是我可能切换到更友好的RAM算法之前处理的最后一个文件。使用该文件,集合的数量大于无符号的32字节int。
我可以计算将会有多少,并且集合的数量对于计算目的很重要,因此溢出不是一种选择。一直到无符号长long int也不是一种选择,因为我已经大大超出了内存使用量。
如何实现可变长度整数以更有效地存储所有内容,以便更有效地计算所有内容?
Ex:小id int得到1或2个字节,最大的int得到5个字节
PS:考虑到我所使用的大小,速度也是一个因素,如果它可以帮助,但它不是最重要的问题:/答案 0 :(得分:0)
将所有内容存储在两个巨大的向量中。
使用关联向量定义两个结构:
struct u { int id; unsigned count };
struct ull { int id, unsigned long long count };
std::vector<u> u_vector;
std::vector<ull> ull_vector;
将计数读入无符号长整数。如果计数符合无符号,则将其存储在u_vector
中,否则存储在ull_vector
中。对两个向量排序;首先输出u_vector
,然后输出ull_vector
。
不要尝试使用unsigned char
做同样的事情 - 结构与u
的大小相同(因为填充使id
对齐)