使用 Python 多线程顺序读取和写入核心文件

Dre*_*her 5 python numpy joblib dask python-xarray

总体目标:我想在不适合内存的数据集上训练 pytorch 模型。

\n\n

现在忘记我谈到的 pytorch,它归结为:从核心或内存映射读取和写入大文件。

\n\n

我找到了很多库,但找不到一个可以让我进行多线程顺序读写的库。我想要做的是有多个线程附加到文件/数据帧(顺序并不重要,无论如何都应该为下游应用程序进行洗牌)。然后在读取时我只需要顺序读取(没有切片,没有索引),但同样应该能够提供多个线程。

\n\n

我发现/提出了以下解决方案:

\n\n
    \n
  • csv:不是一个选项,因为存储浮点数会导致精度损失(处理编码和转义也很糟糕)
  • \n
  • numpy.memmep:你需要提前知道数组的大小,无论是读还是写,追加似乎并不简单。
  • \n
  • dask:我找不到一种附加到数据帧的方法,它总是在附加时创建一个新的数据帧,而且新的数据帧似乎没有文件支持。这看起来很适合阅读,但是没有记录创建新的核心数据框。
  • \n
  • xarray:同样没有关于如何写入文件支持的数据帧的文档,而是文档指出It is important to note that when you modify values of a Dataset, even one linked to files on disk, only the in-memory copy you are manipulating in xarray is modified: the original file on disk is never touched.所以这似乎不可能?
  • \n
  • joblib:同样的故事,阅读是,迭代写作否。
  • \n
  • blaze: 也没有追加行
  • \n
  • vaex:没有追加行。为什么\xe2\x80\xbd
  • \n
\n\n

很高兴它们都支持核心读取,但我需要首先以特定的文件格式获取它(写入)\xe2\x80\x93 我在这里缺少什么?

\n\n

看来多线程写入是一个难题。但即使增量写入单线程,但多线程读取已经很好了,但似乎没有库支持这一点?

\n

Dre*_*her 1

我终于找到了pyarrow的工作解决方案。

增量写入:

import pyarrow as pa

result = []
writer = False
for _, row in df.iterrows():
  result.append(process_row(row))
  if len(result) >= 10000:
    batch = pa.RecordBatch.from_pandas(pd.DataFrame(result))
    if not writer:
      writer = pa.RecordBatchFileWriter(f'filename.arrow', batch.schema)
      writer.write(batch)
      result = []
batch = pa.RecordBatch.from_pandas(pd.DataFrame(result))
writer.write(batch)
writer.close()
Run Code Online (Sandbox Code Playgroud)

将所有内容读入一个数据帧:

pa.RecordBatchFileReader("filename.arrow").read_pandas()
Run Code Online (Sandbox Code Playgroud)

增量阅读:

rb = pa.RecordBatchFileReader("filename.arrow")
for i in range(rb.num_record_batches):
  b = rb.get_batch(i)
Run Code Online (Sandbox Code Playgroud)