首页 > 解决方案 > 生产者快,消费者慢。磁盘 I/O

问题描述

我正在尝试将来自各种 Android 传感器的数据存储到 csv 文件中。

因此,要接受来自 Android api 的传感器数据,必须实现以下方法。

BlockingQueue<SensorEvent> dataQueue;

// Producer: runs on a HandlerThread
@Override
public void onSensorEvent(SensorEvent event) {
    dataQueue.put(event);
}

现在,我使用 apache commons-csv api 将这些数据保存到一个文件中。

CSVPrinter csvPrinter;

// Consumer: runs on a simple java Thread
@Override
public void run() {
    while (true) {
        SensorEvent event = dataQueue.take();
        csvPrinter.printRecord(event.values); // writes float,float,float
        // ... break;
    }
}

传感器可以提供不同的数据速率,最快的是每 4 毫秒为一个传感器生成数据。如果我正在监听多个传感器,这将开始在队列中累积大量数据。消费者正在执行写入 (I/O) 操作,因此它比生产者慢。我知道增加消费者数量可以解决问题的解决方案。所以,如果我在这种情况下增加消费者的数量,就会有两个线程在两个文件中写入数据。

Que:那么,我的问题是并行编写两个文件是个好主意吗?真的会并发吗?或者,磁盘操作本质上是顺序的?有人可以对这个问题有所了解。

谢谢。

标签: javaandroidmultithreadingio

解决方案


推荐阅读