【问题标题】:BigInteger performance for extremely large numbers极大数的 BigInteger 性能
【发布时间】:2013-07-06 23:52:53
【问题描述】:

我正在考虑使用 BigInteger 类来存储 10-1000 MB 范围内的数字。这个事情谁有经验?非常大的数字是否存在实际或隐含的限制?

【问题讨论】:

标签: .net biginteger


【解决方案1】:

好吧,documentation for BigInteger 表示,只要您有足够的内存来处理,数字可以是任意大小。

BigInteger 上的常规操作(加法、减法、乘法等)比常规数值类型慢得多(根据某些测试至少慢 50 倍),但您可能可以忍受。

此外,您必须记住 BigInteger 类型是不可变的,因此对其进行的操作将产生一个新实例。因此,添加两个 10MB 的数字将创建一个新的 10MB 数字。它不会修改现有实例。这可能会影响您如何构建代码。

唯一的实际限制是计算机上的可用内存量和程序可用的内存量。对于 32 位进程,这至少应为 3GB,对于 64 位进程应更多,因此您应该能够使用所需的数字。

【讨论】:

  • 我喜欢 BigInteger 的可变形式。是否存在针对此问题的通用解决方案?
【解决方案2】:

还有计算限制。我遇到了限制。

如果您将 2 个巨大的数字相乘,则计算它们所需的时间是平方的,再加上一些开销。因此,如果您对比先前计算大 7 倍的数字进行乘法运算,则需要大约 50 倍的时间。如果你把它们放大 1000 倍,那么大约需要 1000000+ 倍的时间。

开始循环,你会意识到程序可能永远不会在你的一生中完成

【讨论】:

  • 如果您像 Rune Grimstad 所指出的那样内存不足,我知道有一种方法可以为您的 java 程序分配更多内存,但您必须查找它,因为我不记得如何了。
  • 是的,这是需要考虑的。它主要用于除法,我怀疑它的运行时行为比乘法更糟糕。
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多