java - 来自大量填充的 HashMap 的 CSV 输出

标签 java csv hashmap

我有一个 HashMap ,用于存储各种纬度和经度以及其他属性的值。我想根据用户输入的名为 interval 的输入变量打印它们。间隔越大,hashmap就越大。我的问题是,我目前可以达到的最大间隔是 300,以生成完整的 csv 文件。当我输入400时,excel文件无法完全加载,而且我需要将间隔设置为500。当我将其设置为500时,这是我得到的错误,

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)

我查了一下,显然是因为输出首先复制到一个数组,该数组无法支持这么多数据。有没有办法可以分解我的 HashMap,然后组合然后将它们打印到 csv 中?

FileWriter writer= null;
        String output = "";
        try {
            writer = new FileWriter("output.csv");
            writer.write("Name,Latitude,Longitude,Distance");
            StringBuilder builder = new StringBuilder();
            for (Entry<String, LocationPoint> entry : locationHash.entrySet()) {
                String key = entry.getKey();
                Location lp = entry.getValue();

                double lat = lp.getLatitude();
                double lng = lp.getLongtitude();
                double dist = lp.getDistance();
                String name= "";

                String pName = lp.getPointName();
                if (pName.contains("nearStation") || pName.contains("nearLine")) {
                    name = pName.split("_")[1];
                } else
                    name = pName.split("_")[0];
                //
                builder.append(name);
                builder.append(",");
                builder.append(String.valueOf(lat));
                builder.append(",");
                builder.append(String.valueOf(lng));
                builder.append(",");
                builder.append(String.valueOf(dist));
                builder.append(System.getProperty("line.separator"));

            }
            output = builder.toString();
            mrtWriter.write(output);
            System.out.println("Output Complete");

        } finally {
            if (mrtWriter != null) {
                mrtWriter.close();
            }
        }

** LocationHash 存储键的字符串和值的 Location 对象。

最佳答案

您收到此消息是因为您的 StringBuilder 的增长超过了整数的最大长度 (Integer.MAX_VALUE)。这是数组的最大数量,尝试将其扩展超过此限制会引发您刚刚遇到的异常。

要解决此问题,您只需直接写入 mrtWriter 对象即可。为了提高性能,将其包装到 BufferedWriter 中:

 Writer mrtWriter = new BufferedWriter(new FileWriter(new File("path/to/file")));

如果您出于某种原因想要保留 StringBuilder,请在 StringBuilder 中附加几行,然后调用 mrtWriter.write(builder.toString()),然后调用 output。 setLength(0) 重置 StringBuilder。

关于java - 来自大量填充的 HashMap 的 CSV 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072687/

相关文章:

python - 读取CSV文件时出现 "IndexError: list index out of range"错误如何解决

php - Windows csv和mac csv有什么区别?

java - 为什么这个 Hashmap 迭代不起作用?我收到 NullPointerException

Java 如何获取特定键内的所有映射值?

java - 如何将 HashMap 设为 "search"然后循环结果?

java - Java8 中的 Kerberos/SPNEGO 服务器端身份验证更改

c# - 如何使用 FileHelpers 编写带标题的 CSV 文件?

java - 获取 LinkedHashMap 中每个条目的最后一个元素?

java - 对 Jtable 列进行排序时 JCombo Box 的排序不起作用

java - 拖放不适用于 java 中的 chrome webdriver