以 50hz 的采样率获取 Sensor 数据并保存到文件,采取哪种方式比较好?

2014-11-04 04:45:56 +08:00
 xcv58
最近用 Android Watch 做数据采集,50hz 的频率运行,电池、传感器都不是问题。

现在我的解决方案是:初始化的时候就把文件打开成 PrintStream 并保存到静态变量中。之后每次(20毫秒)都直接把获取的数据写入进去。

现在我的队友说要保存到 List 中直到处理完成的时候一次性写入到文件中。

不知道你们怎么看,有没有什么 Best Practice 参考一下?
2944 次点击
所在节点    问与答
12 条回复
vibbow
2014-11-04 05:17:32 +08:00
肯定用“缓存”的方式更省电啊。
xcv58
2014-11-04 05:47:33 +08:00
@vibbow 明显电量不是问题,内存和性能才是问题。

性能是指尽量使采样不中断或尽可能少地中断。
缓存会产生的问题:
1. 写入缓存数据的等待时间,程序假死
2. 写入过程中采样必然中断,即使使用多线程,也需要考虑同步以及数据一致性问题
3. 缓存过大导致 low system memory

当然实时写也有问题:
1. 大量写入操作
2. 频繁进行 GC
vibbow
2014-11-04 05:53:27 +08:00
做android watch还不考虑电量问题。。。。。。
xcv58
2014-11-04 06:21:16 +08:00
@vibbow 我有实验数据,不间断运行 25小时 耗电59%,不是所有的设备和实验都是电量优先的。

我是来招帮助,不是来和你吵架的。
xcv58
2014-11-04 06:23:16 +08:00
我自己 SB 了,竟然忘记 BufferedWriter 就是天生干这种事情的。

用这个优化之后,大概 17 秒进行一次 GC 每次会暂停消耗 13ms 左右。
Earthman
2014-11-04 07:56:39 +08:00
嗯,工业上这东西用“实时数据库”。用sqlite放在内存也很方便
mhycy
2014-11-04 08:47:08 +08:00
@xcv58 对于第一个疑问,难道就没考虑到实时写入有可能没法完成的情况么?
另外采样应该和写入不是同一个线程的吧?
incompatible
2014-11-04 09:02:59 +08:00
@xcv58 本楼回复的是2楼中你关于缓存的问题

1 写入缓存必然比你进行文件io操作要快(如果缓存比文件io还慢,那真的没必要用它了),怎么会假死??
2. 为何写入过程中必然会导致采样中断?这是个典型的producer-consumer的场景,producer和consumer各开一个线程的话根本不会涉及到同步和一致性的问题。
xcv58
2014-11-04 10:12:03 +08:00
@mhycy 关于「实时写入有可能没法完成」你的意思是文件 IO 出错,空间不足之类的情况吗?
xcv58
2014-11-04 10:16:17 +08:00
@incompatible 写入缓存数据是指将缓存写入到文件。
因为没有使用不同的线程。

Producer/Consumer 的前提是 Producer 生产速度不能超过 Consumer 太多(Buffer size 被填满),否则还是会租塞。
mhycy
2014-11-04 12:18:35 +08:00
@xcv58 负载高的时候你没法保证写入在10ms内完成
xcv58
2014-11-04 12:35:19 +08:00
@mhycy 确实是个问题。但是用 BufferedWriter 就能解决了。

Java 已经提供了对于这种场景的解决方案。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/143758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX