Java Android写入CSV RAM问题

Java Android写入CSV RAM问题,java,android,csv,android-sqlite,android-external-storage,Java,Android,Csv,Android Sqlite,Android External Storage,我正在收集一个服务中的一组传感器数据,将其存储到一个SQL表中,当用户单击一个按钮时,我获取所有SQL数据并将其保存到CSV文件中,但我不断得到窗口已满:请求的分配XXX错误显示在logcat中 通过谷歌搜索,我想这可能是因为Nexus5X内存使用率高 当用户单击“保存”按钮时,开始该过程的代码如下所示: File subjectFile = new File(subjectDataDir, subNum + ".csv"); try{ dbHelper.exportSubjectDa

我正在收集一个服务中的一组传感器数据,将其存储到一个SQL表中,当用户单击一个按钮时,我获取所有SQL数据并将其保存到CSV文件中,但我不断得到
窗口已满:请求的分配XXX
错误显示在logcat中

通过谷歌搜索,我想这可能是因为Nexus5X内存使用率高

当用户单击“保存”按钮时,开始该过程的代码如下所示:

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

try{
    dbHelper.exportSubjectData(subjectFile, subNum);
} catch (SQLException | IOException e){
    mainActivity.logger.e(getActivity(), TAG, "exportSubjectData error", e);
}
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();
}
然后在我的DBHelper中,
exportSubjectData
方法如下所示:

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

try{
    dbHelper.exportSubjectData(subjectFile, subNum);
} catch (SQLException | IOException e){
    mainActivity.logger.e(getActivity(), TAG, "exportSubjectData error", e);
}
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的表有超过300000行和10列

我猜您正在使用opencsv。您可以尝试在每次调用
csvWrite.writeNext(arrStr)
后调用
csvWrite.flush()
。将数据从内存写入光盘。 您必须尝试x的最佳值