如果我有一个VectorSchemaRoot,它已经包含使用Java Apache Arrow库的数据,我该如何将这些数据复制到另一个VectorSchemaRoot?
VectorSchemaRoot
pokxtpni1#
您最常见的做法是为源VectorSchemaRoot中的每个Vector创建一个TransferPair对象,以便将其缓冲区转移到第二个Vector中的新Vector。但是,在这种情况下,您所拥有的并不是真正的“副本”,因为数据是从一个VSR传递到另一个VSR的,而不是复制的。这种方法的一个典型用例是在管道中使用VectorSchemaRoots,它们顺序处理数据。如果你能多说一点你想完成的事情,我也许能提供一个更好的答案。
yrwegjxp2#
这就是我如何实现它。确保关闭originalRoot,否则将出现内存泄漏异常。此外,getAllocator()从RootAllocator创建子分配器,即不要创建一个新的根-你会得到另一个例外,必须有相同的共享根。
originalRoot
getAllocator()
RootAllocator
private VectorSchemaRoot cloneRoot(VectorSchemaRoot originalRoot) { VectorSchemaRoot theRoot = VectorSchemaRoot.create(originalRoot.getSchema(), getAllocator()); VectorLoader loader = new VectorLoader(theRoot); VectorUnloader unloader = new VectorUnloader(originalRoot); try (ArrowRecordBatch recordBatch = unloader.getRecordBatch()) { loader.load(recordBatch); } return theRoot; }
2条答案
按热度按时间pokxtpni1#
您最常见的做法是为源VectorSchemaRoot中的每个Vector创建一个TransferPair对象,以便将其缓冲区转移到第二个Vector中的新Vector。
但是,在这种情况下,您所拥有的并不是真正的“副本”,因为数据是从一个VSR传递到另一个VSR的,而不是复制的。这种方法的一个典型用例是在管道中使用VectorSchemaRoots,它们顺序处理数据。
如果你能多说一点你想完成的事情,我也许能提供一个更好的答案。
yrwegjxp2#
这就是我如何实现它。确保关闭
originalRoot
,否则将出现内存泄漏异常。此外,getAllocator()
从RootAllocator
创建子分配器,即不要创建一个新的根-你会得到另一个例外,必须有相同的共享根。