我想将不同长度的二维数组存储为 AwkwardArray,将它们存储为 Parquet,然后再次访问它们。问题是,从 Parquet 加载后,格式BitMaskedArray
和访问性能有点慢。由以下代码演示:
import numpy as np
import awkward as awk
# big to feel performance (imitating big audio file); 2D
np_arr0 = np.arange(20000000, dtype=np.float32).reshape(2, -1)
print(np_arr0.shape)
# (2, 10000000)
# different size
np_arr1 = np.arange(20000000, 36000000, dtype=np.float32).reshape(2, -1)
print(np_arr1.shape)
# (2, 8000000)
# slow; turn into AwkwardArray
awk_arr = awk.fromiter([np_arr0, np_arr1])
# fast; returns np.ndarray
awk_arr[0][0]
# store and load from parquet
awk.toparquet("sample.parquet", awk_arr)
pq_array = awk.fromparquet("sample.parquet")
# kinda slow; return BitMaskedArray
pq_array[0][0]
如果我们检查退货,我们会看到:
pq_array[0][0].layout
# layout
# [ ()] BitMaskedArray(mask=layout[0], content=layout[1], maskedwhen=False, lsborder=True)
# [ 0] ndarray(shape=1250000, dtype=dtype('uint8'))
# [ 1] ndarray(shape=10000000, dtype=dtype('float32'))
# trying to access only float32 array [1]
pq_array[0][0][1]
# expected
# array([0.000000e+00, 1.000000e+00, 2.000000e+00, ..., 9.999997e+06, 9.999998e+06, 9.999999e+06], dtype=float32)
# reality
# 1.0
问题
如何从 Parquet 加载 AwkwardArray 并快速访问 numpy 值?
来自自述文件(GitHub)的信息
awkward.fromparquet
正在延迟加载 Parquet 文件。
很好,这在做例如时会有所帮助pq_array[0][0][:1000]
新结构的下一层是锯齿状数组是位屏蔽的。尽管没有任何值可以为空,但这是 Parquet 格式化列数据的方式的产物。
我想没有办法解决这个问题。但是,这就是加载速度有点慢的原因吗?我仍然可以numpy.ndarray
通过直接访问数据(无位掩码)来访问数据吗?
额外的尝试
用 Arrow 加载它,然后 Awkward:
import pyarrow as pa
import pyarrow.parquet as pq
# Parquet as Arrow
pa_array = pq.read_table("sample.parquet")
# returns table instead of JaggedArray
awk.fromarrow(pa_array)
# <Table [<Row 0> <Row 1>] at 0x7fd92c83aa90>