【问题标题】:How can I quickly load a large txt file into BigInteger?如何快速将大型 txt 文件加载到 BigInteger 中?
【发布时间】:2017-05-18 11:01:01
【问题描述】:

我正在导入一个大文本文件,1700 万位长,我正在使用以下代码:

BufferedReader reader = new BufferedReader(new FileReader("test2.txt"));
String line = reader.readLine();
System.out.println("Done");
BigInteger num = new BigInteger(line);
System.out.println("Done Again");

它几乎可以立即加载文件并打印出'Done',但将String 转换为BigInteger 需要很长时间(大约一个小时),我能做些什么来加快这个速度起来快速加载号码?

【问题讨论】:

  • 嗯,没有太多空间可以使用您发布的代码。如果你解释你想用这个数字做什么,也许我们可以研究一个替代解决方案。
  • 假设您共享的代码不足以找到问题。已将 post 上的 String 推荐给 BigInteger
  • 一个1700万位数的数字需要很长时间才能解析...
  • 我需要做的就是从一个文本文件中加载一个巨大的数字,然后把它变成一个 BigInteger。我提供了这段代码,因为使用它我可以看到文件本身几乎是即时加载的,但是将其转换为 BigInteger 需要很多时间
  • @SamanthaClark 代码非常慢,因为它是一个庞大的数字。这能回答你的问题吗?

标签: java optimization biginteger


【解决方案1】:

作为一种优化,由于BigIntegerSerializable,您可以将其保存到二进制文件 一次并大大加快加载速度。

加载一个序列化的对象应该比每次都解析一个巨大的字符串要快

使用ObjectOutputStream 保存您的大整数并使用ObjectInputStream 将其读回。

【讨论】:

  • InputStream 和 OutputStream 很好用,非常感谢
  • @SamanthaClark Sweet :) 有时你需要退后一步尝试另一种方法......
  • 是的,问题是我刚开始编程不久,我觉得我已经太深入了,现在有一个非常陡峭的学习曲线(昨天我没有知道如何使用 BufferedReader 一周前我什至无法保存文件 xD)基本上这个网站是天赐之物
  • 嗯,现在我只需要弄清楚如何从 OutputStream 中获取 BigInteger
  • @SamanthaClark 你必须用ObjectOutputStream.writeObject()BigInteger 对象写入文件。不是String。这当然意味着您必须通过new BIgInteger(String) 从您的文本表示中加载它一次。但此后您可以将其作为对象处理。注意序列化流不是文本,不应保存在 .txt 文件中。
【解决方案2】:

这很慢,因为new BigInteger(String) 正在进行从十进制到二进制的基数转换,即O(N2)。对此你无能为力。

您可以通过序列化保存对象本身,或者通过BigInteger.toByteArray() 保存它所存储的字节数组。两者都会立即加载。

【讨论】:

  • 出于好奇,多线程解决方案怎么样?将解析分成块,然后使用乘法和求和合并得到的大整数?
  • @PauloMattos 见 D.E. Knuth,计算机编程的艺术, 第 2 卷,#4.4.E(c)。不确定它是否能在速度方面为您带来任何好处。
【解决方案3】:

正如 cmets 所指出的,您的代码很慢,因为您尝试加载包含大量数字的数字。

如果你对 Java 的 BigInteger 实现的性能不满意,那么我建议你看看别处。

This library 声称拥有一个优于 Java 实现的 BigInteger(请注意,它可能不会加快数字的加载速度,但应该会提高乘法和除法性能)。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2017-07-29
    • 2014-08-10
    • 2013-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多