用Java快速读取巨大的ascii文本文件。需要帮助使用MappedByteBuffer

时间:2013-05-09 20:07:58

标签: java performance filereader memory-mapped-files

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

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

...并且列表继续进行(数千行就是这样)。

我想出了如何使用 FileReader 扫描程序将这些数据分成可用的令牌,但这种方法太慢了。

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

这样,您可以通过Scanner对文件使用MappedByteBuffer。这是否让它表现得更快我不知道。

答案 1 :(得分:0)

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

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;
  }   
  ....
}