Как собрать много данных датчика в файл, а не в память - PullRequest
0 голосов
/ 06 января 2020

В приложении, которое я создаю, мне нужно непрерывно собирать данные датчиков (акселерометр, гироскоп, магнитометр) в течение длительного периода времени, а затем сохранять эти данные в файл.

Хотя я могу успешно делать это в течение коротких периодов времени, если я сканирую слишком долго, я получаю OutOfMemoryError, который приходит из-за превышения лимита ОЗУ.

Так что теперь я пытаюсь Придумайте решение для периодической записи фрагментов данных датчика в файл, чтобы я не столкнулся с этой ошибкой. Есть ли «лучшая практика», когда дело доходит до такого рода вещей, или, может быть, кто-то может направить меня в сторону поста, который проходит через решение?

Спасибо

Изменить

Я собираю данные следующим образом:

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        try {
            /* Write sensor data to ArrayLists */
            int sensorType = sensorEvent.sensor.getType();
            switch (sensorType) {
                case Sensor.TYPE_GYROSCOPE:
                    gyroData.add(new SensorData3D(sensorEvent.values[0],sensorEvent.values[1],sensorEvent.values[2],sensorEvent.timestamp));
                    break;
                case Sensor.TYPE_ACCELEROMETER:
                    accData.add(new SensorData3D(sensorEvent.values[0],sensorEvent.values[1],sensorEvent.values[2],sensorEvent.timestamp));
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    magData.add(new SensorData3D(sensorEvent.values[0],sensorEvent.values[1],sensorEvent.values[2],sensorEvent.timestamp));
                    break;
            }
        } catch (Exception e) {
            Log.e("CRASH", "Failed to write sensor data to array lists");
        }
    }

, где gyroData, accData и magData относятся к типу ArrayList<SensorData3D>

Ответы [ 2 ]

1 голос
/ 06 января 2020

Оставляя в стороне данные абстракции языка - это данные, а не ArrayList<SensorWhatever>. Это просто цифры. С ним вы можете делать все, что захотите, и можете использовать любое представление данных, которое вам нравится. Более читабельный, например, csv, xml или бинарный. Я лично использовал csv как способ обмена данными между электронной таблицей и процессорной программой, поскольку было очень просто читать / писать и общаться между этими объектами.

Простой способ может выглядеть следующим образом: (скажем, ; это разделитель, вы можете использовать все, что вы хотите - , \t являются наиболее популярными)

date;         time;       sensor-id;    data1;    data2; ...;  dataN
2020.01.06;   12.00.00;   gyro;         1.1234;   9.9999;      3.3333
2020.01.06;   12.00.00;   acc;          0.0020;  -0.0987;      9.80665
2020.01.06;   12.00.00;   mag;          11.223;  -34.567;      13.13
2020.01.06;   12.01.00;   gyro;         0.0011;   0.9999;      3.3333
2020.01.06;   12.01.00;   acc;          0.2468;   0.0001;      9.80666
2020.01.06;   12.01.00;   mag;          11.2233;  44.5566;     77.8899 

и затем добавить его в файл журнала. Затем вы можете создавать новый журнал каждый следующий день или в любой другой промежуток времени, в котором вам не нужно исчерпывать память, и все. Синтаксический анализ обратно также прост - вы читаете строку за строкой, разделенную на разделитель, и интерпретируете строки. Не очень сложно.

Или xml, что модно, но сделает журнал намного больше, и вам понадобится парсер xml для его обработки. В обе стороны. Определенно, больше работы.

Если вы выберете двоичную форму, вы можете создать структуру, заполнить ее данными, а затем сохранить как она есть в двоичной форме. Если ваш массив данных имеет или может иметь значение c (с фиксированным числом полей), то ваша задача проста, если он динамический c, тогда у вас будет много проблем с его анализом. Тогда текстовый вариант будет более разумным. Двоичная база данных будет меньше и ее будет легко анализировать, если stati c. Dynami c - это другое дело.

0 голосов
/ 06 января 2020
gyroData, accData, and magData are of the type ArrayList<SensorData3D>

Решением этой проблемы будет запись данных датчика в разные временные файлы и добавление их к ним вместо сохранения всего в памяти. А потом просто скопируйте содержимое в файл, который вы хотите.

Или вы также можете сохранить все в базе данных, каждый раз, когда выбирается новое событие датчика, и перечитывать информацию, когда вам нужно сгенерировать отчет.

Ваши проблемы в том, что вы используете коллекции для хранения данных в памяти и рано или поздно вы собираетесь использовать всю доступную память. Пожалуйста, убедитесь, что при сохранении информации в файлах вы очистите коллекции.

...