gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:04:14 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com