2016-04-22 83 views
3

我正在一个Service中收集一堆传感器数据,将它存储到一个SQL表中,当用户单击一个按钮时,我将所有这些SQL数据都保存到一个CSV文件中,但我不断收到Window is full: requested allocation XXX错误显示在logcatAndroid写入CSV内存问题

从一点谷歌搜索,我认为这可能是由于我的Nexus 5x内存使用率高?

当用户点击保存按钮,代码开始过程是这样的:

File subjectFile = new File(subjectDataDir, subNum + ".csv"); 

try{ 
    dbHelper.exportSubjectData(subjectFile, subNum); 
} catch (SQLException | IOException e){ 
    mainActivity.logger.e(getActivity(), TAG, "exportSubjectData error", e); 
} 
我DBHelper

然后,exportSubjectData方法是这样的:

public void exportSubjectData(File outputFile, String subNum) throws IOException, SQLException { 

    csvWrite = new CSVWriter(new FileWriter(outputFile)); 

    curCSV = db.rawQuery("SELECT * FROM " + DATA_TABLE_NAME + " WHERE id = " + subNum, null); 

    csvWrite.writeNext(curCSV.getColumnNames()); 

    while (curCSV.moveToNext()) { 

     String arrStr[] = {curCSV.getString(0), curCSV.getString(1), curCSV.getString(2), 
       curCSV.getString(3), curCSV.getString(4), curCSV.getString(5), 
       curCSV.getString(6), curCSV.getString(7), curCSV.getString(8), 
       curCSV.getString(9), curCSV.getString(10)}; 

     csvWrite.writeNext(arrStr); 
    } 

    csvWrite.close(); 
    curCSV.close(); 
} 

首先,这种类型的问题通常是由RAM使用引起的?

假设我的问题是该代码段中的RAM使用率很高,是否有更高效的方法可以在不消耗太多内存的情况下执行此操作?它试图写入CSV的表格有超过300,000行和10列

回答

0

我猜你正在使用opencsv。您可以尝试在csvWrite.writeNext(arrStr)的每次x次呼叫后致电csvWrite.flush()。这应该将内存中的数据写入光盘。 你必须尝试x的最佳值。