java.lang.OutOfMemoryError: Java куп пространство за 100 000 записа

Опитвате се да напишете файл в Excel, като използвате следния код

public static void main(String[] args) 
    {
          XSSFWorkbook workbook = new XSSFWorkbook(); 

            XSSFSheet sheet = workbook.createSheet("Book Data");

            Map<String, Object[]> data = new TreeMap<String, Object[]>();
            data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
            for(int i=2;i<100000;i++)
            {               
                data.put(String.valueOf(i), new Object[] {i, "Name"+i, "LastName"+i});
            }

            Set<String> keyset = data.keySet();
            int rownum = 0;
            for (String key : keyset)
            {
                Row row = sheet.createRow(rownum++);
                Object [] objArr = data.get(key);
                int cellnum = 0;
                for (Object obj : objArr)
                {
                   Cell cell = row.createCell(cellnum++);
                   if(obj instanceof String)
                        cell.setCellValue((String)obj);
                    else if(obj instanceof Integer)
                        cell.setCellValue((Integer)obj);
                }
            }
            try
            {

                FileOutputStream out = new FileOutputStream(new File("D:\\nameandlname.xlsx"));
                workbook.write(out);
                out.close();
                System.out.println("nameandlname.xlsx written successfully.");
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
    }

VM arguments -Xms512M -Xmx1024M

eclipse.ini:

-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
1024M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-vm
C:/Program Files (x86)/Java/jdk1.6.0_21/bin/javaw.exe

И накрая грешката се получава:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1592)
    at org.apache.xmlbeans.impl.store.Saver$TextSaver.preEmit(Saver.java:1223)
    at org.apache.xmlbeans.impl.store.Saver$TextSaver.emit(Saver.java:1144)

person being_uncertain    schedule 18.03.2014    source източник
comment
Защо бихте увеличили купчината на eclipse, а не тази на вашето приложение?   -  person Thomas Jungblut    schedule 18.03.2014
comment
Не знам как да го направя. Просто следвайте това, за да разрешите този проблем . Опитвам примерен java файл за тестване.   -  person being_uncertain    schedule 18.03.2014
comment
Възможно ли е да буферирате и записвате данните си с течение на времето, вместо да съхранявате -всичките- в паметта и след това да записвате?   -  person Rogue    schedule 18.03.2014
comment
@Rogue: Не съм пробвал това. Как да стане това? Някакви връзки?   -  person being_uncertain    schedule 18.03.2014


Отговори (1)


Това, от което се нуждаете, е SXSSF (API за стрийминг потребителски модел).

SXSSF (пакет: org.apache.poi.xssf.streaming) е API-съвместимо стрийминг разширение на XSSF, което се използва, когато трябва да се създадат много големи електронни таблици и пространството на купчината е ограничено.

Има и пример на тази страница: трябва да замените XSSFWorkbook с SXSSFWorkbook.

person vadchen    schedule 18.03.2014