在java中,将数据存储在csv中比将其保存在内存中更好吗

在java中,将数据存储在csv中比将其保存在内存中更好吗,java,csv,memory,heap,nio,Java,Csv,Memory,Heap,Nio,我必须从数据库中取出一百万条记录,并将其写入excel文件。 由于复杂性,我无法分割记录的数量。目前,我正在列表中存储数据。列表中的每个bean代表每一行。现在,当我们在内存中保存大量数据时,这就产生了内存问题。 为了解决这个问题,我计划将每一行写入一个CSV文件。读取CSV文件并将数据写入excel。所以我不必把它记在记忆里。我唯一担心的是文件操作所消耗的时间。你怎么想?这是更好的方法吗? 希望,使用java.nio.FileChannel,我们可以更快地读取文件。如果不了解您的用例,就不可能

我必须从数据库中取出一百万条记录,并将其写入excel文件。 由于复杂性,我无法分割记录的数量。目前,我正在列表中存储数据。列表中的每个bean代表每一行。现在,当我们在内存中保存大量数据时,这就产生了内存问题。 为了解决这个问题,我计划将每一行写入一个CSV文件。读取CSV文件并将数据写入excel。所以我不必把它记在记忆里。我唯一担心的是文件操作所消耗的时间。你怎么想?这是更好的方法吗?
希望,使用java.nio.FileChannel,我们可以更快地读取文件。

如果不了解您的用例,就不可能说它是否更好

这仍然是一个可行的选择。使用堆外内存/磁盘缓存可以减少堆大小,但最终还是使用了内存。i、 e.字节数不必有任何不同

如果您有一个CSV文件,一种方法是对文件进行内存映射,找到每行的末尾,并将此信息存储在数组或另一个内存映射文件中。当您这样做时,您可以不使用系统调用访问任何单独的行,也不使用任何堆。(实际上,对于1GB或更大的文件,它只使用了几KB)

一条建议


如果可能,使用LIMIT和OFFSET或WHERE子句对数据进行分页,并在每次SELECT时在内存中存储100k。。因为从数据库中选择的几行数据要比写入csv并随后再次读取快得多…

假设数据库查询返回的行直接映射到要写入最终文件的行,那么在任何时候都不需要在内存中存储多行数据

您需要使用这个类,它将把您的数据流到后台的临时文件中

下面是一个简单的例子:

// Create streaming workbook
SXSSFWorkbook workbook = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = workbook.createSheet();

// Output data
int rownum = 0;
for (List<String> rowdata : data) {
    Row row = sh.createRow(rownum++);
    int cellnum = 0;
    for (String celldata : rowdata) {
        Cell cell = row.createCell(cellnum++);
        cell.setCellValue(celldata);
    }
}

// Save workbook to final destination 
FileOutputStream out = new FileOutputStream("output.xlsx");
workbook.write(out);
out.close();

// Remove temporary files
workbook.dispose();
//创建流式工作簿
SXSSFWorkbook工作簿=新SXSSFWorkbook(100);//在内存中保留100行,超过的行将刷新到磁盘
Sheet sh=工作簿.createSheet();
//输出数据
int rownum=0;
对于(列表行数据:数据){
Row Row=sh.createRow(rownum++);
int-cellnum=0;
用于(字符串celldata:rowdata){
Cell Cell=row.createCell(cellnum++);
cell.setCellValue(celldata);
}
}
//将工作簿保存到最终目标
FileOutputStream out=新的FileOutputStream(“output.xlsx”);
练习册。写(出);
out.close();
//删除临时文件
workbook.dispose();

您使用什么技术来访问数据?Excel将加载一个CSV文件,因此您不必担心这一部分。平均记录的大小是多少?1M*1KB的行数只有1GB,这听起来不太像现在的样子(除非您使用手机;)@PeterLawrey这正是我的目标:)