java - 如何在java中快速将大的csv文件转换为json数组

标签 java json

我想将一个大的 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();

不幸的是,我们不知道您实际使用的 JSONArrayCDL 类。因此,很难说为什么它们很慢,或者是否有更快的方法来进行转换。 (但我怀疑最大的性能问题出现在前面的代码片段中。)

关于java - 如何在java中快速将大的csv文件转换为json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24306088/

相关文章:

java - 升级到 JRE 1.7.0_13 后小程序类名称错误

java - Apache速度无法找到资源

java - 使用 RestTemplate 异常处理的 Spring 端点到端点

java - 转换为国际字符不适用于 jsonobject.tostring 但适用于字符串文字?

java - 如何使用 Jackson 库将 json 映射对象转换为对象数组

javascript - 如何获取随机 json 数据并附加到 div 元素

java - 如何在 Java 中处理关闭请求

java - 使用信号量打印 2 个线程的替代输出

php - 如何使用这样的脚本或文本编辑器批量更新位于 .html 文件中的基本一对一 key 结构?

javascript - JSON Schema 中的 additionalItems 和 additionalProperties 有什么区别?