为什么计算机内存4倍增长,为什么将文件读入内存需要4倍于Java的内存?

我有以下代码读取跟随文件,将\ r \n附加到每行的末尾并将结果放入字符串缓冲区:

public InputStream getInputStream() throws Exception {

StringBuffer holder = new StringBuffer();

try{

FileInputStream reader = new FileInputStream(inputPath);

BufferedReader br = new BufferedReader(new InputStreamReader(reader));

String strLine;

//Read File Line By Line

boolean start = true;

while ((strLine = br.readLine()) != null) {

if( !start )

holder.append("\r\n");

holder.append(strLine);

start = false;

}

//Close the input stream

reader.close();

}catch (Throwable e){//this is where the heap error is caught up to 2Gb

System.err.println("Error: " + e.getMessage());

}

return new StringBufferInputStream(holder.toString());

}

我尝试读取400Mb文件,并将最大堆空间更改为2Gb,但它仍然给出了内存堆异常.有任何想法吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一种可能的实现方式: 1. 使用Jackson库进行Json解析,它支持流式处理,不会一次性将整个Json字符串读入内存。 2. 采用多线程处理,将大量Json字符串分割成若干个小段,每个线程处理一段,避免单线程处理过多Json字符串导致CPU占用过高。 3. 使用内存池技术,重复利用已经分配的内存空间,避免频繁的内存分配和释放,从而减少内存占用。 以下是代码示例: ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class JsonToObjectConverter { private static final ObjectMapper mapper = new ObjectMapper(); /** * 将大量Json字符串转换为对象集合 * @param jsonList Json字符串列表 * @return 对象集合 */ public List<Object> convert(List<String> jsonList) { List<Object> result = new ArrayList<>(); ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); try { for (String json : jsonList) { executorService.execute(() -> { try { JsonParser parser = mapper.getFactory().createParser(json); Object object = mapper.readValue(parser, Object.class); synchronized (result) { result.add(object); } } catch (IOException e) { e.printStackTrace(); } }); } } finally { executorService.shutdown(); } return result; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值