【问题标题】:Reading huge ascii text file quickly in Java. Need help using MappedByteBuffer在 Java 中快速读取巨大的 ascii 文本文件。需要帮助使用 MappedByteBuffer
【发布时间】:2013-05-09 20:07:57
【问题描述】:

我有一个包含数千行数据的文本文件,如下所示:

38.48,88.25
48.20,98.11
100.24,181.39
83.01,97.33

...而且列表还在继续(就像这样有数千行)。

我想出了如何使用 FileReaderScanner 将这些数据分成可用的标记,但是这种方法太慢了。

我创建了以下分隔符: src.useDelimiter(",|\n");

然后使用扫描器类 nextDouble() 获取每条数据。

我做了很多研究,看起来解决方案是使用 MappedByteBuffer 将数据放入内存并在那里访问它。问题是我不知道如何使用 MappedByteBuffer 将这些数据分成可用的令牌。

我找到了这个站点:http://javarevisited.blogspot.com/2012/01/memorymapped-file-and-io-in-java.html - 它帮助我将文件映射到内存中,并解释了如何读取文件,但看起来数据是以字节或二进制形式返回的?我试图访问的文件是 ascii,我也需要能够以 ascii 格式读取数据。谁能解释如何做到这一点?有没有一种方法可以像使用扫描仪和以前的 FileReader 方法一样扫描映射到内存中的文件?还是有另一种更快的方法?我目前的方法所花费的时间是它应该花费的时间的近 800 倍。

我知道有些人可能会说我正在尝试重新发明轮子,但这是出于学术目的,因此,我不允许使用外部库。

谢谢!

【问题讨论】:

  • 您需要将所有数据保存在内存中还是只读取它一行一行。
  • 我需要每行读取它来查询数据。目前这个过程大约需要 40 秒来处理近一百万行数据,但我需要更快地完成。如果我能在不到一秒的时间内完成,那就太好了。
  • 我建议在初始化时对数据进行一次传递,并将其存储在内存中的适当结构中。那么对数据的访问就会很快,你就不用担心读取的速度了。
  • 这听起来是个不错的解决方案。我没有任何经验这样做。如何将这些数据放入内存并存储到包含双精度的结构中?
  • 查看将 FileReader 包装在 BufferedReader 中是否可以提高性能。

标签: java performance filereader memory-mapped-files


【解决方案1】:

要将数据加载到内存中,您可以像之前一样使用 Scanner,然后将每一行存储在一个列表中,如下所示。

List<Pair> data = new ArrayList<Pair>();

其中 Pair 定义为

class Pair {

  private final double first;
  private final double second;

  public Pair(double first, double second) {
    this.first = first;
    this.second = second;
  }   
  ....
}

【讨论】:

  • 我正在尝试实现这个结构,但我不知道如何将数据分配给这个结构。我试过: data.add(double, double) 但这不起作用。我尝试在 Pair 类中创建一个 set 方法,但它不会让我因为“first”和“second”被声明为“final”。我知道我可以改变这一点,但我确实希望它们成为最终值。那么如何将项目添加到此列表中?
  • 答案可以在这里找到:stackoverflow.com/questions/16504569/…
  • 这仍然需要 40 秒才能将所有这些内容加载到内存中,但是一旦加载到内存中,我就可以更快地对这些数据进行后续搜索。之前每次搜索需要 40 秒。谢谢你的建议!有什么方法可以更快地将其加载到内存中?
  • 此时,如果您所做的只是从文件中读取数据结构,速度将主要取决于数据文件的大小和存储设备的速度。
【解决方案2】:

MappedByteBufferByteBuffer 的子类,您可以在其上调用asCharBuffer。这将返回一个实现ReadableCharBuffer,然后可以将其提供给Scanner

这样您就可以通过MappedByteBuffer 对文件使用Scanner。我不知道这是否使它执行得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多