我正在制作的应用程序中,我需要长时间连续收集传感器(加速度计,陀螺仪,磁力计)数据,然后将这些数据保存到文件中。
尽管我可以在短时间内成功完成此操作,但是如果扫描时间太长,则会收到由于达到RAM限制而导致的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>
撇开语言抽象数据是数据,而不是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解析器来处理它。双向。当然,还有更多工作。
如果选择二进制格式,则可以创建结构,在其中填充数据,然后将其保存为二进制格式。如果您的数据数组是或可以是静态的(具有固定的字段数),那么您的工作就很容易,如果它是动态的,那么将其解析回去将遇到很多问题。那么基于文本的选项将更加明智。如果是静态的,二进制数据库将变得更小并且易于解析。动态是另一回事。
gyroData, accData, and magData are of the type ArrayList<SensorData3D>
解决此问题的方法是将传感器数据写入不同的临时文件中,并将其附加到它们上,而不是将所有内容都保留在内存中。然后,只需将内容复制到所需的文件中即可。
或者您也可以在每次选择新的传感器事件时将所有内容存储在数据库中,并在需要生成报告时重新读取信息。
您的问题是您正在使用集合将数据保存在内存中,迟早要消耗所有可用的内存。请确保在将信息存储在文件中时将清空集合。