1

首先,我是 Java 新手,我需要一些帮助来解决以下问题。

我有一个包含数百万条记录的 Java 列表。我想将此数据列表导出为 CSV 文件。以下是我为读取数据而编写的函数,但它对于数百万条记录都失败了。你能建议任何更好的方法吗?

 private String generateCsvData(List<Map<String, Object>> rows) {

    String output = reportService.getReportHeadder();

    for (Map row : rows) {  

        output += (Long) row.get("branchId")
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("branches"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("categoryName"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("products"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row.get("emails"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("contactAddress"))
                + ","
                + StringEscapeUtils.escapeCsv((String) row
                        .get("contactDet")) + ","
                + StringEscapeUtils.escapeCsv((String) row.get("url"))
                + "\n";

    }

    return output;
}
4

7 回答 7

3

是的,轻松愉快。

如果您打算一次将所有记录保存在内存中,那么您遇到了问题。你的机器只有这么多内存,而且只有一部分分配给 JVM。当你填满它时,游戏就结束了。您已经在Map. 当您必须同时存储它的 .csv 表示时,您的问题就会加倍。

一种解决方案是一次流出一行。您可以迭代Map并只存储一次数据。

另一种解决方案可能是将所有数据存储在关系数据库表中。您可以迭代 aResultSet并将结果以这种方式流式传输。现在你真的减少了你的记忆需求。

您创建行的机制不好。我更喜欢StringBuilder过度连接。

于 2013-08-01T09:45:32.040 回答
3

我建议使用OpenCSV它对读取和写入数据到 CSV 文件有很好的支持。

于 2013-08-01T09:43:30.407 回答
2

问题是您正在创建一个非常长的字符串,然后想要将其写入文件。

此外,您连接的每个 tiem 都会创建一个新字符串。在这些情况下使用StringBuilder

您必须使用流顺序写入。基本 io是开始学习的好点

于 2013-08-01T09:43:21.773 回答
1

在写入文件之前将所有内容存储在字符串中,如果在生成文件时逐行写入文件会怎样?

于 2013-08-01T09:43:10.980 回答
1

使用 CSV 库,例如OpenCSV

您可以逐行处理文件 - 读取一行,然后处理它,然后再次丢弃它。这样,文件最多只有一行在内存中。

于 2013-08-01T09:43:57.860 回答
1

首先,如果您在循环中构造一个字符串,请不要连接字符串,但我们StringBuilder通常会执行得更好,并且不会用大量中间字符串浪费您的记忆。

但是在这种情况下,我建议不要将所有内容都保存在内存中,而是在处理过程中直接写入文件。这将减少所需的内存。查看PrintWriter或寻找已经满足您需要的库(例如OpenCSV)。

于 2013-08-01T09:47:14.137 回答
0

为什么不使用像 Spring Batch 这样的框架,它分块操作,理论上可以帮助编写很多!!!!!!!记录

于 2013-08-01T09:45:32.963 回答