我读了一些分隔符分隔的文本文件。
我的文本文件内容的示例
AVC高清EFG jksjd
1 2 3 5
3 4 6 0
一行行和使用散列映射具有行号为整数类型的密钥和文本文件的每一行作为List对象其保持在存储器
想想,我的地图将存储信息,这样
整数列表
1 [AVC DEF EFG jksjd]
我使用Apache POI写入到Excel中。 当写入到Excel中使用Apache POI,我下面这种方法,这里是我的代码片段
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Sample sheet");
Map<Integer, List<Object>> excelDataHolder = new LinkedHashMap<Integer, List<Object>>();
int rownum = 0;
for (Integer key : keyset) {
Row row = sheet.createRow(rownum++);
List<Object> objList = excelHolder.get(key);//excelHolder is my map
int cellnum = 0;
for (Object obj : objList) {
Cell cell = row.createCell(cellnum++);
cell.setCellValue((Date) obj);
}
}
这工作得很好,如果行/记录写入到Excel的数量较少。 试想一下,如果记录都在数十亿,或者如果文本文件有更多的行承担100万。我觉得,我的方法失败,因为createRow和createCell创建堆超过10万级的对象。 无论在Java到Excel API,我觉得写进去(EXCEL)是基于同样的方法即,如上图所示收集的迭代。 我做了一些的Aspose例子,以及作为结果的Aspose也有我想同样的问题。
- 是否createRow和createCell创建新的对象每次被调用时?
- 如果是,什么是另类? 我怎么会写大数据具有更好的性能脱颖而出?
最近的一个Apache的POI的版本sxssf 。 从网站复制无耻
SXSSF(包:org.apache.poi.xssf.streaming)是XSSF的API兼容流扩展时非常大的电子表格必须生产中使用,和堆空间是有限的。 SXSSF通过限制访问是一个滑动窗口内的行实现其低内存占用,而XSSF给人的文件中获取所有行。 旧的行均在窗口不再变得不可访问,因为它们将被写入磁盘。
我曾用它与150万行创建电子表格。
我会针对的Aspose.Cells为Java回答,因为你尝试过了。
创建或加载一个非常大的Excel文件几乎总是需要大量的内存。 即使你一次读取一行或多行,还是你会写的内容,工作簿,它被加载到内存的实例。
方案1(不好的,非常有限):增加堆大小,如果最大堆大小允许的作品为您最大的文件,选择它。
方案2(复杂一些体力劳动):Excel 2007和更高版本允许每片约100万行。 我建议你创建一个工作簿中的只有一张1万行。 也就是说,如果你在文本文件10万线,创建10个单独的Excel工作簿。
后来,手动在一个Excel工作簿将它们结合起来。 面对如此庞大的数据复制图纸时的Aspose.Cells会给内存溢出异常。
下面是创建10个单独的Excel文件,每个都具有一个百万行的代码片段。
import com.aspose.cells.*;
import java.util.*;
public class ExcelLargeTextImport
{
private static String excelFile = Common.dataDir + "largedata.xlsx";
public static void main(String args[])
{
try
{
Common.setLicenses();
importToExcel();
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
private static void importToExcel() throws Exception
{
// Process each workbook in a method
for (int sheetCounter=0 ; sheetCounter<10 ; sheetCounter++)
{
saveWorkbook(sheetCounter);
}
}
private static void saveWorkbook(int sheetCounter) throws Exception
{
Workbook workbook = new Workbook();
// Get the first sheet
Worksheet worksheet = workbook.getWorksheets().get(0);
Cells cells = worksheet.getCells();
// Initialize array list with 1 million records
ArrayList<String> lines = new ArrayList<String>();
int rowCount = 1000000;
for (int i=0 ; i<rowCount ; i++)
{
lines.add(i + ";value1;value2;value3");
}
long lineNo = 1;
for (String line : lines)
{
// Split the line by delimeter
String[] values = line.split(";");
// First cell
Cell cell = cells.get("A" + lineNo);
cell.setValue(values[0]);
// Second cell
cell = cells.get("B" + lineNo);
cell.setValue(values[1]);
// Third cell
cell = cells.get("C" + lineNo);
cell.setValue(values[2]);
// Fourth cell
cell = cells.get("D" + lineNo);
cell.setValue(values[2]);
lineNo++;
}
System.out.print(sheetCounter + " ");
// Saving the Excel file
workbook.save(excelFile.replace(".xlsx", sheetCounter + ".xlsx"));
System.out.println("\nExcel file created");
}
}
PS。 我在阅读Aspose开发者传播者。
你为什么不这样做的读取和写入的块。 这是我能想到的办法:
- 阅读几行的txt文件,并把信息在地图中,你在做什么。 假设你阅读100行,你必须在你的地图100个条目。
- 写这百年项Excel文件,第一次genarate了Excel
- 清空你的地图或重新初始化。
- 现在读接下来的100线形成文本。 所以,我的理解有没有办法直接访问的第101行,而不读第100行。 所以,你可能必须从一开始读文件,但可以避开前100行和创建在地图中的条目。
- 现在更新的Excel文件。 我想你可以使用更新POI Excel的这个环节上提到: 编辑使用JXL API / Apache的POI现有的Excel文件
如果保持这个迭代过程。 你一定会救你的内存消耗,虽然我没有看到在CPU消耗的主要区别。
希望能帮助到你!
这里是你的答案...
试试这个简单的代码:如果您需要进一步的将来,你可以...广告
https://stackoverflow.com/a/16479713/1490962