我想将一个大的 csv 文件(例如 20000 到 50000 条记录文件)转换为 json 数组,但转换需要近 1 分钟,有什么方法可以在不到 5 秒的时间内实现它。
ResourceBundle rb = ResourceBundle.getBundle("settings");
String path = rb.getString("fileandfolder.Path");
System.out.println(path + "ssdd");
String csvPath = request.getParameter("DP") != null ? request
.getParameter("DP").toString() : "";
String orname = path + csvPath;
File file = new File(orname);
FileReader fin = new FileReader(file); //Read file one by one
BufferedReader bi = new BufferedReader(fin);
int res;
String csv = "";
while ((res = fin.read()) != -1) {
csv = csv + ((char) res); //Converted int to char and stored in csv
}
long start3 = System.nanoTime();
JSONArray array = CDL.toJSONArray(csv);
String Csvs = array.toString();
long time3 = System.nanoTime() - start3;
System.out
.printf("Took %.3f seconds to convert to a %d MB file, rate: %.1f MB/s%n",
time3 / 1e9, file.length() >> 20, file.length()
* 1000.0 / time3);
最佳答案
您的代码中有两个明显的性能问题,都在此代码段中:
while ((res = fin.read()) != -1) {
csv = csv + ((char) res);
}
第一个问题:fin
是一个无缓冲的FileReader
,因此每个read()
调用实际上都是在进行系统调用。每个系统调用都是数百甚至数千条指令。您正在对输入文件中的每个字符执行此操作。
补救措施:从bi
读取而不是从fin
读取。 (这就是你创建它的目的......大概。)
第二个问题:每次执行csv = csv + ((char) res);
时,您都会创建一个比前一个字符长一个字符的新字符串。如果输入文件中有 N
个字符,则最终会复制大约 N^2
个字符来构建字符串。
补救措施:不要连接字符串,而是使用 StringBuilder ...,如下所示:
StringBuilder sb = new StringBuilder();
....
sb.append((char) res);
....
String csv = sb.toString();
<小时/>
目前,我不清楚将 csv
字符串转换为 JSON 是否也存在性能问题;即在这个片段中。
JSONArray array = CDL.toJSONArray(csv);
String Csvs = array.toString();
不幸的是,我们不知道您实际使用的 JSONArray
和 CDL
类。因此,很难说为什么它们很慢,或者是否有更快的方法来进行转换。 (但我怀疑最大的性能问题出现在前面的代码片段中。)
关于java - 如何在java中快速将大的csv文件转换为json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24306088/