【发布时间】:2013-05-09 20:07:57
【问题描述】:
我有一个包含数千行数据的文本文件,如下所示:
38.48,88.25
48.20,98.11
100.24,181.39
83.01,97.33
...而且列表还在继续(就像这样有数千行)。
我想出了如何使用 FileReader 和 Scanner 将这些数据分成可用的标记,但是这种方法太慢了。
我创建了以下分隔符: 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