Как сгенерировать более 1000 событий в секунду в java, используя время сна

У меня есть генератор событий для Flink CEP, код которого приведен ниже. По сути, я использую Thread.sleep() и где-то читал, что java не может спать меньше 1 миллисекунды, даже если мы используем System.nanoTime(). Код для генератора

public class RR_interval_Gen extends RichParallelSourceFunction<RRIntervalStreamEvent> {

Integer InputRate  ;  // events/second
Integer Sleeptime ;
Integer NumberOfEvents;

public RR_interval_Gen(Integer inputRate, Integer numberOfEvents ) {
    this.InputRate = inputRate;
    Sleeptime = 1000 / InputRate;
    NumberOfEvents = numberOfEvents;
}

@Override
public void run(SourceContext<RRIntervalStreamEvent> sourceContext) throws Exception {


    long currentTime;
    Random random = new Random();
    int RRInterval;
    int Sensor_id;

   for(int i = 1 ; i <= NumberOfEvents ; i++) {
        Sensor_id =  2;
       currentTime = System.currentTimeMillis();

       // int randomNum = rand.nextInt((max - min) + 1) + min;
       RRInterval =  10 + random.nextInt((20-10)+ 1);

        RRIntervalStreamEvent stream = new RRIntervalStreamEvent(Sensor_id,currentTime,RRInterval);

        synchronized (sourceContext.getCheckpointLock())
        {
            sourceContext.collect(stream);
             }
        Thread.sleep(Sleeptime);
    }
}

@Override
public void cancel() {

}

}

Я уточню свое требование здесь простыми словами. Я хочу, чтобы класс генератора генерировал события, скажем, поток ЭКГ с частотой 1200 Гц. Этот генератор будет принимать такие параметры, как скорость ввода и общее время, за которое мы должны сгенерировать поток.

Пока все хорошо, проблема в том, что мне нужно отправить более 1000 событий в секунду. Как я могу сделать это, используя функцию генератора, которая генерирует значения U[10,20]?

Также, пожалуйста, дайте мне знать, если я использую неправильный способ генерации x событий в секунду в приведенном выше ниже.

Sleeptime = 1000 / InputRate;

заранее спасибо


person Amarjit Dhillon    schedule 08.11.2017    source источник
comment
Зачем тебе спать?   -  person jontro    schedule 08.11.2017
comment
Просто чтобы убедиться, что генерируемые события являются однородными, а не отправлять поток, а затем ждать завершения указанного интервала времени, а затем отправлять снова, таким образом, события не будут одинаковыми по времени прибытия.   -  person Amarjit Dhillon    schedule 08.11.2017
comment
SleepTime является целым числом, поэтому Sleeptime = 1000 / InputRate; даст ноль, если inputRate больше 1000. Вы используете неправильные типы данных или неправильное разрешение таймера. Если вы работаете в миллисекундах, вы не сможете обработать более 1000 событий в секунду.   -  person user207421    schedule 08.11.2017
comment
Вы можете занять ожидание, как указано в этом ответе stackoverflow.com/a/11498647/429972 . Хотя не уверен, что это рекомендуется   -  person jontro    schedule 08.11.2017


Ответы (1)


Минимальное время сна в для систем Windows составляет ~ 10 мс и в Linux и Macintosh составляет 1 миллисекунду как -100-наносекунд">упоминается здесь.

Степень детализации сна обычно ограничивается периодом прерывания планировщика потоков. В Linux этот период прерывания обычно составляет 1 мс в последних ядрах. В Windows период прерывания планировщика обычно составляет около 10 или 15 миллисекунд.

Благодаря своим исследованиям я узнал, что использование нановременного сна в Java не поможет, так как проблема находится на уровне ОС. Если вы хотите отправлять данные в arrival rate > 1000 контролируемым образом, это можно сделать с помощью операционных систем реального времени (RTOS), поскольку они могут спать менее миллисекунды. Теперь я придумал другой способ сделать это, но в этом решении время между прибытиями не будет постоянно распределяться.

Допустим, вам нужна скорость поступления 3000 events/ second, тогда вы можете создать for loop, который выполняет 3 итерации для отправки данных на каждой итерации, а затем засыпает на 1ms. Таким образом, для трех кортежей время прибытия будет близко друг к другу, но проблема будет решена. Это может быть глупым решением, но оно работает.

Пожалуйста, дайте мне знать, если есть лучшее решение для этого.

person Amarjit Dhillon    schedule 27.06.2018