【问题标题】:Variable length int C++可变长度 int C++
【发布时间】: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 个数字。
  • 那么你的“套装”是什么? CodeBooksCodeBooksCodeWords?

标签: c++ int overflow ram


【解决方案1】:

将所有内容存储在两个巨大的向量中。

定义两个带有关联向量的结构体:

struct u { int id; unsigned count };
struct ull { int id, unsigned long long count };

std::vector<u> u_vector;
std::vector<ull> ull_vector;

将计数读入 unsigned long long。如果计数适合无符号数,则将其存储在 u_vector 中,否则存储在 ull_vector 中。对两个向量进行排序;输出u_vector第一和ull_vector第二。

不要试图用 unsigned char 做同样的事情 - 结构将与 u 大小相同(因为填充使 id 对齐)。

【讨论】:

  • “还有什么比一个巨大的油漆泡泡更糟糕的呢?!” “我知道!两个巨大的油漆气泡!”
  • 但是说真的,我想我可能需要解释更多代码,因为这对我的问题来说是歪曲的。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2014-06-17
  • 2013-06-23
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多