Pyarrow为什么以及何时应该使用流缓冲区编写器?

2024-10-02 00:39:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从自定义二进制文件(使用多处理和随机访问)中读取大量数据,以便执行计算并存储到拼花地板数据集。 我知道列数,但不知道要存储的项目数

因此,文件被剪切到N逻辑部分,并且每个部分都由块读取器函数处理。 因此,我应该:

  1. 使用python类型List(通过append动态分配)创建x列,并在块末尾创建一个记录批
  2. 与(1)相同,但每个y记录创建一个记录批。这里我们按批次控制项目的数量。这个过程可能会慢一些,因为我们必须在每次迭代时设置一个条件(if no_items == y:…
  3. 从(1)开始,最后将记录批存储到RecordBatchStreamWriter中以返回缓冲区
  4. 以(2)开头,最后将记录批存储到RecordBatchStreamWriter中以返回缓冲区
  5. 其他

我读了ipcmemoryarrow-streaming-columnar两本书,但仍然不清楚如何处理一个巨大的随机访问文件

谢谢你的洞察力


Tags: 文件数据函数类型记录二进制读取器逻辑
1条回答
网友
1楼 · 发布于 2024-10-02 00:39:27

如果所需的输出是拼花数据集,而输入格式是自定义二进制文件,那么记录批处理API可能不会帮助您,除非您将计算分散到多个进程(而不是线程)。您提到了多线程处理,所以有可能是这种情况,但我只是想确定您不是指多线程

另外,当你说一个拼花数据集时,我不确定你是指一个巨大的拼花文件,还是指一个公共目录结构中的一些拼花文件。通常,“拼花数据集”是多个拼花文件

这项任务有很大的灵活性,因此如何执行这项任务可能取决于您以后要如何读取数据

输出

  1. 多个文件。创建多个拼花文件,其中每个拼花文件包含数据的所有列,但仅包含X行。如果您可以在数据中的某些列(例如测量日期/制造日期/设备id/实验条件)上对批次进行分区,那么您将能够非常有效地使用这些列作为以后的查询参数(例如,如果您稍后按度量日期查询,您可以通过文件名和目录名简单地确定要加载哪些文件)。在这种情况下,您将需要dataset APIs。您也可以使用这种方法按行数进行分区,尽管您希望在该情况下比单个文件具有相同的优势(使用仅支持整个文件拼花读取的第三方拼花工具将更容易)

  2. 单个文件。您可以创建一个巨大的单个拼花地板文件,该文件分为多个“行组”。这将允许您稍后读取单个行组,或者通过一次处理一个行组来执行内存高效的批处理。缺点是您只能按“行数”进行批处理因此,如果您以后希望通过时间戳列之类的方式进行查找,那么您可能必须读取/扫描所有数据(除非您知道将时间戳映射到行号的某种方法)。如果您希望使用这种方法,则需要使用ParquetWriter来编写各个行组

输入

在写入上述任何内容之前,您需要以自定义格式读取数据,并将数据转换为箭头格式。如果纯粹使用python进行此操作,成本可能会很高,但由于它是一种自定义格式,因此不太可能使用内置的箭头工具读取数据。如果自定义格式具有任何类型的native library for reading in data然后使用这些库读入数据、提取相关数据缓冲区并用arrow元数据包装它们以便arrow能够访问它们可能会更快。使用python操作生成的arrow元数据对象(例如表/分块数组等)应该是非常简单/快速的

如果您选择用python解析文件,那么解析的成本可能会非常大,以至于您选择哪种选项1-4都无关紧要。理想情况下,您希望能够将输入文件读入您打算编写的块中。希望这样做会很容易,比如在固定大小的一批行中读取(所有列)从输入文件中删除

如果希望输出格式由一个或多个列进行分区(例如,由测试条件进行分区),则会更加复杂。如果无法很好地了解测试条件如何映射到行,则可能需要将整个文件作为一个表读入内存,进行多次传递,或者拥有多个文件(例如,不是每个测试标准一个文件,而是每个测试标准20个文件,只需将输入文件读取为20个批次)

工控机

由于您提到了多处理和记录批处理读写器,我将稍微介绍一下它们的使用方法然后您可以使用记录批读取器/写入器。例如,假设您有一个进程完全用于读取自定义文件并将其解析为箭头格式。然后,该进程可以使用记录批处理编写器将这些文件发送到下一个进程,该进程将使用记录批处理读取器读取这些文件。例如,第二个过程可以将记录批写入一些拼花文件。记录批读取器/写入器允许您以箭头格式写入,以便在进程之间快速传输

总结

如果不了解您正在阅读的文件以及最终的处理/查询目标,很难准确地说出该做什么。我认为你的问题的简单答案是,你阅读输入的方式将取决于你最终想要创建输出的方式

相关问题 更多 >

    热门问题