Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自大量填充的HashMap的CSV输出_Java_Csv_Hashmap - Fatal编程技术网

Java 来自大量填充的HashMap的CSV输出

Java 来自大量填充的HashMap的CSV输出,java,csv,hashmap,Java,Csv,Hashmap,我有一个hashmap,它存储不同纬度和经度的值以及其他属性。我想根据名为interval的用户输入变量将它们打印出来。间隔越大,hashmap越大。我的问题是,我现在可以点击的最大间隔是300,以生成一个完整的csv文件。当我输入400时,excel文件无法完全加载,而且我需要将间隔设置为500。当我把它设为500时,这是我得到的错误 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.u

我有一个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();
            }
        }
FileWriter=null;
字符串输出=”;
试一试{
writer=newfilewriter(“output.csv”);
写(“姓名、纬度、经度、距离”);
StringBuilder=新的StringBuilder();
for(条目:locationHash.entrySet()){
String key=entry.getKey();
Location lp=entry.getValue();
双纬度=lp.getLatitude();
双lng=lp.GetLongtude();
双距离=lp.getDistance();
字符串名称=”;
字符串pName=lp.getPointName();
if(pName.contains(“近站”)| | pName.contains(“近线”)){
name=pName.split(“”)[1];
}否则
name=pName.split(“”)[0];
//
builder.append(名称);
生成器。追加(“,”);
builder.append(String.valueOf(lat));
生成器。追加(“,”);
builder.append(String.valueOf(lng));
生成器。追加(“,”);
builder.append(String.valueOf(dist));
append(System.getProperty(“line.separator”);
}
output=builder.toString();
mrtWriter.write(输出);
System.out.println(“输出完成”);
}最后{
if(mrtWriter!=null){
mrtWriter.close();
}
}

**LocationHash为键存储一个字符串,为值存储一个Location对象。

之所以会出现这种情况,是因为StringBuilder的增长超过了整数的最大长度(integer.MAX\u值)。这是一个数组的最大数目,如果试图将其扩展到超过此限制,则会引发刚刚出现的异常

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

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

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

之所以会出现这种情况,是因为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。

之所以会出现这种情况,是因为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。

之所以会出现这种情况,是因为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。

或者,如果您使用它进行缓冲,请使用BufferedWriterHanks!我决定我的StringBuilder没有用处。你可以使用BufferedWriterHanks!如果你使用它进行缓冲,请使用BufferedWriterHanks!我决定我的StringBuilder没有用处。你可以使用BufferedWriterHanks!如果你使用它进行缓冲,请使用BufferedWriter HankserThanks!我决定我的stringbuilder没有用处。你爸爸干杯,或者,如果你用它来缓冲,就用一个缓冲的Writer Hanks!我决定我的stringbuilder没有用处。你爸爸干杯