我需要找出csv文件中每个字段的最大长度。
例如在下面 cvs
文件(因为1) var1
有最长的字符串 shj
三个字符,
2) var2
有最长的字符串 asdf
-4个字符
3) var3
有 asddfs
-6个字符
var1,var2,var3
a,asdf,df
aa,,
shj,,asddfs
所以,我需要的结果是数组 int [] maxLength = {3,4,6}
到目前为止,我使用的是csv阅读器api。这是我的密码
CSVReader reader = new CSVReader (new FileReader(Looks.fileName));
int [] maxLength = new int[reader.readNext().length];
for (int i = 0; i < row.length; i++) {
maxLength[i] = row[i].trim().length() ;
}
while ((row = reader.readNext()) !=null ) {
for (int i = 0; i < row.length; i++) {
maxLength[i] = Math.max(maxLength[i] , row[i].trim().length() );
}
}
reader.close();
很好用。但是对于一个大文件来说太慢了。我有大约100000000行。
有什么有效的方法吗?我能用吗 setAsciiStream
如何更有效地估计长度?
2条答案
按热度按时间yizd12fk1#
你的代码是尽可能的高效-它只读取每个字节一次,一次,它不做任何昂贵的寻找文件。
有可能是
FileReader
在一个BufferedReader
可以提高性能--尽管这不是不可能的CSVReader
使用BufferedReader
内部。从磁盘读取100000000行的速度有物理限制。这是值得的基准测试最简单的程序,你可以写,读取整个文件,看看需要多长时间,才决定你的csv阅读器是缓慢的。
更新:证实了我的怀疑,假设你使用的是opencsv。
以下是opencsv的源代码:http://sourceforge.net/p/opencsv/code/head/tree/trunk/src/au/com/bytecode/opencsv/
的构造函数
CSVReader
PackageReader
在一个BufferedReader
如果它还不是BufferedReader
.CSVReader.readNext()
只是打电话而已BufferedReader.readLine()
反复地对字符进行一些基本的操作。这是读取文件的最快方法:从头开始,一直读到最后,使用缓冲区以使底层磁盘读取的大小符合硬件和设备驱动程序的要求。
在一个大文件上运行上面的程序,你会发现它花费的时间和你的csv解析程序差不多——因为即使我的程序没有做任何明显的处理,它也和你的程序有同样的瓶颈——从磁盘读取的速度。
的确
cat largefile >/dev/null
(unix)或type largefile >NUL
也需要同样的时间。使用探查器运行代码,您会发现它花费了更多的时间等待
read()
(在作为核心java一部分的本机方法中)而不是其他任何地方。你不能对你的java程序做任何事情来加速它。您可以通过调整硬件和/或操作系统来提高速度,比如调整文件系统参数和驱动程序设置,将文件放在ramdisk或ssd上,等等。
zc0qhyus2#
是
CSVReader
缓冲的?如果没有,把你的衣服包起来FileReader
用一个BufferedReader
(并使其成为一个很好的大缓冲区大小)。