我目前正在使用java bytebuffer
ByteBuffer batch = ByteBuffer.allocate(tuple_size * batch_size ) ;
int pos = 0;
int sent = 0;
while ( sent++ < batch_size) {
Event event = (Event) it.next();
batch.put(event.getData(), pos, tuple_size);
pos += tuple_size;
}
return batch.array();
当前,批处理大小设置为2。我的问题是,在第二轮中,我得到了一个indexootfoundseception,鉴于此,我无法解释,打印出以下细节:
System.out.println(pos + " " + batch.capacity() + " " + batch.position() + " " + batch.remaining());
我得到:0 200 0 200(第0轮)
100(第1轮)
这正是人们所期望的。现在,根据文档,绑定支票似乎确实有效:
offset - The offset within the array of the first byte to be read; must be non-negative and no larger than array.length
length - The number of bytes to be read from the given array; must be non-negative and no larger than array.length - offset
如何完全填满缓冲区(同时保持底层缓冲区具有长度元组大小*批大小?)
2条答案
按热度按时间mrzz3bfm1#
从您的问题来看,元组大小是否足以容纳event.getdata()并不明显。如果不是,那将导致您的indexoutofboundsexception。也许是差一点?
另一种可能是迭代器
it
只包含一个元素。编辑:根据文档,如果缓冲区空间不足,应该会得到bufferoverflowexception。引用文件:
此方法将字节从给定的源数组传输到此缓冲区。如果要从数组中复制的字节数多于此缓冲区中剩余的字节数,即如果length>remaining(),则不传输任何字节,并引发bufferoverflowexception。
这说明你的问题不是你所期望的。
6tdlim6h2#
我想你不需要pos变量。这个
put
方法正在尝试读入event.getData()
在pos位置,当我认为你想读的时候event.getData()
从位置0开始。你可以简单地使用batch.put(event.getData())
将数组的全部内容追加到缓冲区中。