首页 > 解决方案 > 保存笨拙1数组的最佳方法?

问题描述

所以回到尴尬的 v0 是可能的;

import awkward
dog = awkward.fromiter([[1., 2.], [5.]])
cat = awkward.fromiter([[4], [3]])
dict_of_arrays = {'dog': dog, 'cat': cat}
awkward.save("pets.awkd", dict_of_arrays)

然后我们可以延迟加载数组

reloaded_data = awkward.load("pets.awkd")
# no data in ram
double_dog = reloaded_data["dog"]*2
# dog is in ram but not cat

简而言之,有一个由“狗”和“猫”部分组成的数据集。整个数据集保存到磁盘上的一个文件中。即使我没有任何文档,什么数据是狗什么是猫也很明显。Dog 和 cat 加载为尴尬的数组。我可以加载数据并只使用一个部分,而另一部分不会在 ram 中结束。

我正在寻找在尴尬的 v1 中执行此操作的最佳方法。我想满足的要求是;

我看了看,awkward1.to_parquet虽然它看起来不错,但似乎只是为了保存一个数组。这不适合保存多种数据类型的需要,而且我不确定如何记录列名。我想我可以转换回笨拙的 v0 并以这种方式保存,但我不确定延迟加载将如何发挥作用。可能是我需要编写一个包装器来做这些事情,这完全没问题,但我想先检查是否有我应该知道的内置内容。

编辑; 给出的答案很好。为了完整起见,我想留下一个使用它的例子;

In [1]: import awkward1 as ak

In [2]: dog = ak.from_iter([[1., 2.], [5.]])
   ...: cat = ak.from_iter([[4], [3]])

In [3]: ak.zip?

In [4]: pets = ak.zip({"dog": dog, "cat": cat}, depth_limit=1)

In [5]: pets.dog
Out[5]: <Array [[1, 2], [5]] type='2 * var * float64'>

In [6]: pets.cat
Out[6]: <Array [[4], [3]] type='2 * var * int64'>


In [7]: ak.to_parquet(pets, "pets.parquet")


标签: awkward-array

解决方案


Awkward v0 所做awkward0.save的完全等同于酸洗(在 v0 或 v1 中),因此特殊名称“save”已被删除。(它的灵感来自 NumPy 的“保存”和“加载”,但最终我们只是制作了 Awkward__setstate____getstate__做同样的事情。)

但是选择/旧式保存不会延迟加载。(编辑:实际上,我忘记了旧式保存确实会延迟加载,但只是在最高粒度 - dict 中单独的数组成为 ZIP 文件中单独的“文件”。Parquet 延迟加载嵌套记录的子字段.)

你说得对,ak.to_parquet/ak.from_parquet是延迟加载的好选择,而且这种文件格式比我们的选择格式具有更好的压缩到读取速度。这也是许多程序认可的标准。(如果您使用它,我建议通过use_dictionary=Falseand传递use_byte_stream_split=True浮点数据;此页面上的所有选项都可以提供给ak.to_parquetas **options。我需要添加一些文档来解释这些是浮点数据的好选项。)

ak.to_parquet仅采用一个数组参数也是如此。但这很好:创建一个数组,而不是字典。Awkward Array 操作数据结构的事实可以帮助您。您可以使用与 dict 键相同的字段名称将所有数组一起ak.zip 压缩到一个数组中。如果它们具有不同的内部结构,则可以防止它尝试在所有级别上将它们与 对齐depth_limit=1,如果它们甚至具有不同的长度,则可以在长度为 1 的外部结构中满足每个

has_one_more_dimension = original_array[np.newaxis]

ak.to_parquet用于列名的名称来自 Awkward Array 本身的记录。记录中的不同字段可以有不同的数据类型。因此,您压缩它们的名称Parquet 文件的列名,而准备好的列可以具有不同的类型。

Parquet 文件按列(包括嵌套记录的字段)和按行组延迟加载。如果要配置读取行组的粒度,请将文件写入分区数组(ak.partitionedak.repartition)。


推荐阅读