![](/img/trans.png)
[英]How to collect and write multiple sensor data to a file simultaneously in android?
[英]How to collect lots of sensor data to file instead of to memory
在我制作的應用程序中,我需要長時間連續收集傳感器(加速度計、陀螺儀、磁力計)數據,然后將這些數據保存到文件中。
盡管我可以在短時間內成功執行此操作,但如果掃描時間過長,我會收到OutOfMemoryError
,這是由於達到 RAM 限制。
所以現在我試圖想出一個解決方案來定期將傳感器數據塊寫入文件,這樣我就不會遇到這個錯誤。 對於這類事情,是否有任何“最佳實踐”,或者有人可以指出我通過解決方案的帖子的方向嗎?
謝謝
編輯
我正在收集數據如下:
@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>
此問題的解決方案是將傳感器數據寫入不同的臨時文件並將其附加到它們,而不是將所有內容都保存在內存中。 然后只需復制您想要的文件中的內容。
或者您也可以將所有內容存儲在數據庫中,每次選擇新的傳感器事件並在需要生成報告時重新讀取信息。
您的問題是您使用集合將數據保存在內存中,遲早您將消耗所有可用內存。 請檢查將信息存儲在文件中時是否會清空集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.