百万级数据放到一个List中 如何预防内存溢出 请写出java示例
可以使用分批读取数据的方式将数据分批加载到内存中,防止一次性加载过多数据导致内存溢出。具体实现可以使用Java的Stream API,将数据按照指定大小分割成多个子列表,然后分别处理每个子列表。
示例代码如下:
List<Data> dataList = new ArrayList<>();
int batchSize = 10000; // 指定批量读取的数据量
try (Stream<String> stream = Files.lines(Paths.get("data.txt"))) {
List<String> lines = stream.collect(Collectors.toList());
for (int i = 0; i < lines.size(); i += batchSize) {
List<String> batchLines = lines.subList(i, Math.min(i + batchSize, lines.size()));
List<Data> batchData = processData(batchLines); // 处理每个批次的数据
dataList.addAll(batchData);
}
} catch (IOException e) {
e.printStackTrace();
}
// 处理每个批次的数据
private List<Data> processData(List<String> lines) {
List<Data> dataList = new ArrayList<>();
for (String line : lines) {
// 解析每行数据,转换成Data对象
Data data = parseData(line);
dataList.add(data);
}
return dataList;
}
在上述代码中,我们将数据文件按行读取到一个字符串列表中,然后根据指定的批次大小,将数据分割成多个子列表,分别处理每个子列表中的数据,并将处理结果存储到总的数据列表中。这样可以有效地控制内存使用量,避免一次性加载过多数据导致内存溢出
原文地址: https://www.cveoy.top/t/topic/eGOP 著作权归作者所有。请勿转载和采集!