2016-04-22 6 views
3

Ich sammle eine Reihe von Sensordaten in einem Service, speichern Sie es in eine SQL-Tabelle, und wenn der Benutzer auf eine Schaltfläche klickt, nehme ich alle diese SQL-Daten und speichern Sie sie in eine CSV-Datei , aber ich bekomme immer Window is full: requested allocation XXX Fehler im LogcatAndroid Schreiben in CSV RAM Ausgabe

Von ein wenig googeln ich denke, das könnte aufgrund der hohen RAM-Nutzung auf meinem Nexus 5x sein?

Wenn der Benutzer auf die Schaltfläche Speichern klickt, um den Code beginnt der Prozess wie folgt aussieht:

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

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

Da ist in meinem DBHelper, die exportSubjectData Methode sieht wie folgt aus:

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(); 
} 

Erstens ist diese Art von Problem normalerweise durch RAM-Nutzung verursacht?

Angenommen, mein Problem ist hohe RAM-Auslastung in diesem Codeabschnitt, gibt es einen effizienteren Weg, dies zu tun, ohne so viel Speicher zu verbrauchen? Die Tabelle, die versucht, in CSV zu schreiben, hat über 300.000 Zeilen und 10 Spalten

Antwort

0

Ich denke, Sie verwenden opencsv. Was Sie versuchen können, ist csvWrite.flush() nach jedem x Anrufe von csvWrite.writeNext(arrStr) aufrufen. Das sollte die Daten aus dem Speicher auf die Disc schreiben. Sie müssen versuchen, was der beste Wert für x ist.