【问题标题】:Disruptor how to use his ring buffer to read a file?Disruptor如何使用他的环形缓冲区来读取文件?
【发布时间】:2014-03-24 10:47:28
【问题描述】:

我正在寻找使用 dirsuptor 环形缓冲区来解析文件。但我看不到如何为环形缓冲区设置一个值范围。

在下面的示例中似乎。它循环到每个项目以将其分配给缓冲区。但是我,我想直接分配 x 项。

当我执行 FileInputStream.read(byte[] bytes) 时,我想将这些字节放入环形缓冲区。

通常我的缓冲区比我读取的字节大两倍。像这样我可以在计算一个页面时读取另一页(例如字节数组长度==缓冲区/2):

ExecutorService exec = Executors.newCachedThreadPool();
// Preallocate RingBuffer with 1024 ValueEvents
Disruptor<ValueEvent> disruptor = new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY, 1024, exec);

// Build dependency graph
RingBuffer<ValueEvent> ringBuffer = disruptor.start();

for (long i = 10; i < 2000; i++) {
    String uuid = UUID.randomUUID().toString();
    // Two phase commit. Grab one of the 1024 slots
    long seq = ringBuffer.next();
    ValueEvent valueEvent = ringBuffer.get(seq);
    valueEvent.setValue(uuid);
    ringBuffer.publish(seq);
}

谢谢

【问题讨论】:

  • 我觉得Disruptor 的用法很奇怪。你为什么决定这样做?
  • 如果您仍然决定使用它:您需要先构建一组值,然后一次性设置。但是为什么?
  • 我想使用它,因为我读取了一个字节流。他的长度是 'PAGE_SIZE * x' 。缓冲区可以截断提供的数据,所以我需要向前阅读。使用环形缓冲区会有所帮助

标签: java performance disruptor-pattern


【解决方案1】:

自从 Disruptor 的 3.0.0 版本开始支持批量发布。

Ringbuffer 上有多种 publishEvents 方法,具体取决于您希望如何转换您的事件。

鉴于您的示例代码,我怀疑您想查看this 版本,并提供UUIDs 数组。根据您希望传递给翻译器的参数数量,有多个版本。

alternative version是自己捕获EventTranslator中的UUID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2019-03-09
    • 2012-04-04
    相关资源
    最近更新 更多