【问题标题】:Java Out of memory heap spaceJava 内存堆空间不足
【发布时间】:2021-11-20 12:47:44
【问题描述】:

实际上我有一个java内存堆空间不足的问题,我的代码如下:

它适用于中等大小的 csv 文件,另一方面,它适用于大型 csv 文件,java 内存不足错误。

非常感谢您的帮助:)

package routines;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.io.*;
import java.util.*;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
public class RemoveLineBreakFromCsvHelper {
public static void updateCSV (String fileToUpdate) throws IOException {
        File inputFile = new File(fileToUpdate);
        // Read existing file
        CSVReader reader = new CSVReader(new FileReader(inputFile), ';');
        List<String[]> csvBody = reader.readAll();
        System.out.println("Read CSV File");
       
        // get CSV row column and replace with by using row and column
        for(int i=0; i<csvBody.size(); i++){
            String[] strArray = csvBody.get(i);
            for(int j=0; j<strArray.length; j++){
           
                if(strArray[j].contains("\n")){ //String to be replaced
               
                System.out.println("Remove Line Breaks");
                    csvBody.get(i)[j] = strArray[j].replace("\n".toString(), ". "); //Target replacement
                   
                }
            }
        }
        reader.close();
        // Write to CSV file which is open
        CSVWriter writer = new CSVWriter(new FileWriter(inputFile), ';');
        writer.writeAll(csvBody);
        writer.flush();
        writer.close();
    }
}

【问题讨论】:

  • 您好@StephenC,文件大小为 500 万行。
  • 为什么标记为 Talend?如果您在 Talend 中执行此操作,我可以建议使用 Talend 组件而不是 java 代码的解决方案
  • 我没有静态模式我有一个动态模式,这就是我使用 java 的原因

标签: java csv file memory


【解决方案1】:
List<String[]> csvBody = reader.readAll();

如果您正在读取一个大文件,这会读取大量数据。

相反,一个接一个地读取每一行,然后一个接一个地写入:

String[] strArray;
while ((strArray = reader.readNext()) != null) {
  // ...

  writer.writeNext(strArray);
}

由于您当前正在写入正在读取的同一文件,因此您需要先写入另一个文件,然后移动新文件以覆盖旧文件。

【讨论】:

  • 感谢您的回答,但我不知道如何用您的代码更改我的代码,请您帮帮我。知道我在其中发现包含 \n (换行符)的双引号之间的字段的部分,并将它们替换为句点(。)
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多