V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xcv58
V2EX  ›  问与答

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

  •  
  •   xcv58 · 2014-11-04 04:45:56 +08:00 · 2933 次点击
    这是一个创建于 3678 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近用 Android Watch 做数据采集,50hz 的频率运行,电池、传感器都不是问题。

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

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

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

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

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

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

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

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

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

    Java 已经提供了对于这种场景的解决方案。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:43 · PVG 19:43 · LAX 03:43 · JFK 06:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.