java - Android 写入 CSV RAM 问题

标签 java android csv android-sqlite android-external-storage

我正在服务中收集一堆传感器数据,将其存储到 SQL 表中,当用户单击一个按钮时,我会获取所有这些 SQL 数据并将其保存到 CSV 文件中,但我不断收到 Window is full: requested allocation XXX logcat 中显示错误

通过一些谷歌搜索,我认为这可能是因为我的 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 使用率很高,是否有更有效的方法来做到这一点而不消耗那么多内存?它试图写入 CSV 的表有超过 300,000 行和 10 列

最佳答案

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

关于java - Android 写入 CSV RAM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36786469/

相关文章:

android - 为什么在 Android NDK 图像中将 YUV_420_888 转换为 RGBA_8888 旋转 90 度?

excel - CSV 文件中的日期格式奇怪的行为

java - Hibernate 的 setFirstResult() 问题与 Oracle jdbc 驱动程序

java - 如何在java中读取HTML属性值?

java - 核心java多线程-线程没有结束

javascript - 有没有办法在 Javascript 中按行号将 CSV 数据存储在数组中?

php - 在 Linux 中创建基于文件的 Cron 作业

java - 在用户定义的 Java 类中创建 ArrayList

android - Photoview 禁用缩小图像

java - Android MediaPlayer 在同时播放两种声音时有时会跳过或失败