【发布时间】:2016-05-09 04:56:43
【问题描述】:
我有一个程序,它接收一个只是集合列表的文件,每个集合都有自己的整数标识符,然后按成员数对集合进行排序。
文件格式(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;
随着我运行的每个文件,集合的数量越来越大,目前我只是将所有内容存储到巨大的矢量数据中。我最新的文件足够大,我已经接管了服务器的内存并流入交换。这将是我在可能切换到对 RAM 更友好的算法之前处理的最后一个文件。使用该文件,集合的数量大于无符号的 32 字节 int。
我可以计算会有多少,集合的数量对于计算目的很重要,所以溢出不是一个选项。一直到 unsigned long long int 也不是一种选择,因为我已经几乎用尽了内存使用量。
如何实现可变长度整数来更有效地存储所有内容,从而更有效地计算所有内容?
例如:小的 id 整数得到 1 或 2 个字节,最大的整数得到 5 个字节
PS:考虑到我正在使用的规模,如果可以提供帮助,速度也是一个因素,但这不是最重要的问题:/
【问题讨论】:
-
当然,您可以定义自己的类,根据需要准确分配内存并实现所有需要的操作(乘法、加法、赋值......)。但也许(如果你告诉我们更多关于你的算法)另一种对内存更友好的解决方案会有更大的帮助。
-
等一下.. 我确定我以前见过这个问题。和 Anedar 的确切评论......我会失去剧情吗?!
-
我做对了吗:您的文件包含一个标识符(适合四个字节)和一个计数(并不总是适合四个字节)。对吗?
-
@MartinBonner 计数是 ID,计数不适合 4 个字节,但使用 8 个字节没有意义,因为我溢出了 1 或 2 个数字。
-
那么你的“套装”是什么?
CodeBooks、CodeBooks或CodeWords?