【问题标题】:Best way to handle a lot of ints处理大量整数的最佳方法
【发布时间】:2010-02-06 12:15:53
【问题描述】:

我有一个大约 10-100k 个整数的数组,我需要存储(尽可能压缩),并以最快的方式检索回完整的数组。用 c# 之类的语言处理这类事情的最佳方法是什么。

【问题讨论】:

  • 尽可能压缩的存储和尽可能快的检索几乎是矛盾的。你真的想要哪一个?也许更多的上下文?
  • 另外,这些数字的范围是多少?
  • 在任意数据上没有“尽可能压缩”之类的东西。如果您有 1000000 位进入,那么平均而言,假设没有数据,将有 1000000 位输出。压缩通过识别数据中的冗余并利用它们来起作用;你能保证数据会有冗余吗?如果不是,那么它已经尽可能地压缩了。现在,就是说,在某些假设下存在最优压缩算法。例如,已知霍夫曼编码是最优前缀算法。

标签: c# xml compression integer


【解决方案1】:

这取决于您所说的“尽可能压缩”。

您可以使用 BinaryWriter 将整数写入流,或使用 BitConverter.GetBytes 将每个 int 作为四个字节复制到一个大数组中。两者都可以存储每个 int 而不需要任何额外的元数据。

如果您希望它比这更压缩,BinaryWriter 有一个 Write7BitEncodedInt 方法,该方法可以在更少的字节中写入具有小值的整数。您还可以使用 GZipStream 类在将数据打包成字节数组后尝试进一步压缩数据。

通常,您想要的越小,处理时间就越长。要在您想要的速度和大小之间取得平衡,您只需要进行一些测试即可。

【讨论】:

  • '尝试进一步压缩' - 尝试成为有效词。压缩东西并不能保证它实际上会更小!
  • +1 “一般来说,你想要的越小,处理时间越长”几乎不用多说
【解决方案2】:

根据int 数组中值的性质,游程编码可能是另一种选择。也就是说,如果数组中的连续单元格都具有相同的值,则只需存储该序列中第一次出现的值,以及之后重复的次数。这可能特别适用于“稀疏”数据。

【讨论】:

  • 您可以使用 RLE 轻松高效地对整个数据集进行编码和解码 - 但是无需付出相当大的努力,在压缩的同时使用数据将是疯狂的。然而,RLE 是一种在数值库中使用的技术——但他们花费了相当多的复杂 LOC 使其可用。另外,您可以简单地提到仅使用 RLE 的标准压缩方案 - 大多数标准方案都这样做。
【解决方案3】:

100,000 ints 没那么大,为什么要压缩这么多?

【讨论】:

  • 假设 int = 4 bytes 那么就是 390k - 一个不错的 IMO 大小,完全取决于你对“大”的定义
  • 存储数据结构的常用方法是序列化,其中一种常用格式是 XML。如果你对一个 100k 的 int 数组这样做,它会变得相当大......
【解决方案4】:

回答您的具体问题

  1. 选择足够大且仅足以存储数据的数据类型,例如 uint32_t 或 int64_t。注意:它必须是固定长度。
  2. 将数据以二进制形式(背靠背)写入到文件中。
  3. 将数据直接读回到您的数组类型的内存中。

问题以最佳方式解决。如果您想要磁盘压缩,请通过压缩库运行数据。在您尝试使用数据时将数据压缩在内存中通常是禁忌(一般解决方案使用其他技术)。如果您想了解为什么它是禁止的,请说明。

大型数据集计算的一般答案

专门的数学库处理这些问题(例如,octave 或 matlab),特别是处理比您的计算机可以想象的更多数字的问题。

这些库具有执行引擎和特定语言,但您通常可以通过编程方式与它们交互。

【讨论】:

  • "问题以最佳方式解决。"这并不能满足他的压缩要求。
  • 您可以像对问题的评论中指出的那样进行压缩或速度——我上面提到的通用解决方案将以可用的方式表示大量整数数据。不过,我在答案中添加了更多信息。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多