我有一个程序从给定目录中读取.txt文件。每条记录行都包含一个数据,我正在解析它。我认为这对性能而言代价高昂,但我可能错了。这是方法。如何改进它以提高性能?
currentLine = uploadFileReader.readLine();
while (!isBlankOrNull(currentLine)) {
line++;
String[] record = parseRecord(currentLine);
// process the record array here..
}
private String[] parseRecord(String currentLine){
String[] recordLine = currentLine.split("\\|");
String[] record = null;
String[] zeroArray = null;
if(recordLine.length == 4){
zeroArray = new String[] {"0","0","0","0","0","0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else if(recordLine.length == 5){
zeroArray = new String[] {"0","0","0","0","0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else if(recordLine.length == 6){
zeroArray = new String[] {"0","0","0","0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else if(recordLine.length == 7){
zeroArray = new String[] {"0","0","0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else if(recordLine.length == 8){
zeroArray = new String[] {"0","0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else if(recordLine.length == 9){
zeroArray = new String[] {"0"};
record = (String[]) ArrayUtils.addAll(recordLine, zeroArray);
}else{
record = recordLine;
}
return record;
}
示例文件内容:
0000710000|07-23-2015|08-24-2015|257072140993|1|0.2|0.3|||
每个空/空白管道都有“0”默认值
答案 0 :(得分:1)
我能想到的唯一解释是花费6分钟读取2000行文件:
您使用的是无缓冲的阅读器。
个别行很长。
以上两点。
在任何一种情况下,识别性能瓶颈的好方法是使用分析器。
如果(假设)问题是由上述原因之一引起的,您可以通过(分别)改善阅读时间:
使用Reader
,
BufferedReader
使用Scanner
直接从阅读器阅读,而不是阅读整行和分割,
避免将整个文件内容保存在内存中。
我倾向于认为2.不会产生很大的不同,并且3.除非文件非常大,否则不会。
答案 1 :(得分:0)
您可以更简单地重写如下。要求似乎返回一个字符串数组始终长度为10,“0”填充任何未使用的单元格?
如果没有真正的测试数据,我无法评论它与原始数据的相对性能,但是它显然“更少”工作,更少的数组分配,条件检查等,因此“非常可能”更快......
private String[] parseRecord(String currentLine) {
String[] recordLine = currentLine.split("\\|");
String[] record = new String[10];
for (int i = 0; i < record.length; i++) {
if (i < recordLine.length) {
record[i] = recordLine[i];
} else {
record[i] = "0";
}
}
return record;
}
测试
public static void main(String[] args) {
System.out.println(Arrays.toString(parseRecord("1")));
System.out.println(Arrays.toString(parseRecord("1|2")));
System.out.println(Arrays.toString(parseRecord("1|2|3|4|5|6|7|8|9")));
System.out.println(Arrays.toString(parseRecord("1|2|3|4|5|6|7|8|9|10")));
}
输出
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]