2016-04-22 82 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的最佳值。