使用java API编写apache arrow格式时是否存在大小限制/问题

使用java API编写apache arrow格式时是否存在大小限制/问题,java,limit,apache-arrow,Java,Limit,Apache Arrow,我的arrow writer从CSV文件中读取数据对于小于1GB的数据来说效果很好,但是在这个限制下遇到了问题(写入代码似乎会阻塞)。我为进程(-Xmx12g)提供了足够的内存,数据大小约为1.2GB。类似的结构化文件行数较少,大约0.4 GB,使用相同的代码也可以正常工作 我只是想知道,apache arrow目前是否对所创建的向量有一些限制,或者对行数有限制。最好澄清一下它到底是如何失败的(我假设您看到了一个异常)。但要解决这个问题 目前,每个包含向量的缓冲区都有2GB的限制。此外,所有箭头

我的arrow writer从CSV文件中读取数据对于小于1GB的数据来说效果很好,但是在这个限制下遇到了问题(写入代码似乎会阻塞)。我为进程(-Xmx12g)提供了足够的内存,数据大小约为1.2GB。类似的结构化文件行数较少,大约0.4 GB,使用相同的代码也可以正常工作


我只是想知道,apache arrow目前是否对所创建的向量有一些限制,或者对行数有限制。

最好澄清一下它到底是如何失败的(我假设您看到了一个异常)。但要解决这个问题

目前,每个包含向量的缓冲区都有2GB的限制。此外,所有箭头向量当前都使用
int
索引,因此行限制为2^31-1。由于默认分配过程是如何工作的(缓冲区大小加倍),您可能会在不预先分配的情况下接近实际限制

对于Arrow,尤其是Java,最好的做法是创建小批量(例如,读取N行,将它们转换为一个批,然后再次写入,而不是尝试读取整个文件)。这种方法的一个例子可以在最近的重构中看到


开发人员邮件列表中已经出现了更改API以支持64位索引/大小的问题。

感谢这一点-我实际上发现在加倍时确实出现了内存溢出:org.apache.arrow.memory.outofmemory异常:由于内存限制,无法分配大小为134217728的缓冲区。当前分配:2016947468但我是否需要对所有列向量只使用一个分配器,还是可以对每列使用一个分配器?您提到的JDBC示例还显示了整个过程中只有一个分配器。如果不是,这将意味着我的总内存使用量限制为2GB?或者我遗漏了什么?我可以解决这个问题:分配器接受一个关于最大大小的参数,并将其设置为Integer.MAX_VALUE,我从一些示例中复制了该参数,并假设(错误地)它是允许的最大值。实际上,可以将其设置为更大的值,然后我的读者就可以处理更大的文件了。