【问题标题】:Loading a file into main memory将文件加载到主存中
【发布时间】:2012-03-22 03:56:20
【问题描述】:

我有这个文本文件,其中包含一个单词列表和一堆与每个单词相关的分数。我想从文件中读取单词和单词并在我的项目中使用它们。代码是 Java 的,文件本身大约 13MB。当我尝试读取文件时,大约需要 15 分钟才能完成,有时甚至更长时间。关于我应该如何从头开始优化或解决这个问题的任何想法。

对文件执行的操作是 - 1. 阅读每一行(平均大约 50 个字符) 2. 使用单个空格拆分成标记(平均情况下大约 10 个标记) 3.将生成的token存储在一个数组中(此阶段仅此而已)

编辑:很抱歉之前没有发布我的代码,这只是我的想法。 http://pastie.org/3646388 那里有一条线,我循环到 10000 个值,这是为了查看是否有任何输出,而不是循环到 EOF。

【问题讨论】:

  • 你能分享你的代码吗?可能会有一些优化。
  • 如果你在 commodore 64 上运行它或者你的代码有问题……我们看不到。
  • 是的,如上所述,更多的代码是有帮助的,但是即使在现在的 PC 上,读取 13MB 文件 15 分钟也非常慢。我不认为文件操作是这里的瓶颈。我的建议: 1. 如果第 2 步,哪个拆分令牌使用的 CPU 比预期的多?如果是这样,优化那里的代码; 2、如果第3步需要大量的内存分配操作,先分配一个足够大的数组(或者ArrayList?),然后调JVM有更大的启动堆。
  • 首先,我建议您分析您的代码并确定它在哪里花费时间。这是引导您朝着正确方向努力的最佳方式。
  • 在高速 PC 上,您应该能够使用 BufferedReader 以 90 MB/s 的速率读取文件。大约需要 0.3 到 0.6 秒。

标签: java file optimization nlp tokenize


【解决方案1】:

您需要发布代码示例,否则我们只是推测。但是,如果您使用 java.io 类(InputStream 或 Reader),请确保您使用 BufferedInputStream 或 BufferedReader 包装 InputStream 或 Reader。

由于您正在阅读文本,构建阅读器的代码可能类似于:

new BufferedReader(new InputStreamReader(new FileInputStream("/path/to/file")));

来自BufferedReaderJavaDoc:

一般情况下,Reader 发出的每个读取请求都会导致相应的 对底层字符或字节流的读取请求。它 因此建议将 BufferedReader 包裹在任何 Reader 周围 其 read() 操作可能代价高昂,例如 FileReaders 和 输入流读取器。

您还应该考虑分析您的代码。如果您手边没有分析器,请尝试JVisualVM。它与JDK一起打包。

【讨论】:

  • 如果您还用BufferedInputStream 包裹FileInputStream,效果会更好。双缓冲会有所帮助似乎很奇怪,但(至少在许多系统上)确实如此。
  • FileInputStream 没有任何缓冲。
  • 我认为@TedHopp 的意思是使用输入流来扭曲它。
  • @viki.omega9 - 不,我的意思是“包装”:new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream("path"))))
  • @Tedd Hopp 有趣...我不会猜到同时使用 BufferedReader 和 BufferedInputStream 会有什么不同。你看到这样做有多大的加速?您知道性能提升的原因吗?
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2020-08-23
  • 1970-01-01
  • 2015-12-24
  • 2011-09-07
  • 1970-01-01
相关资源
最近更新 更多