python - 使用 Python 多线程顺序读取和写入核心文件
问题描述
总体目标:我想在不适合内存的数据集上训练一个 pytorch 模型。
现在忘记我谈到了 pytorch,它归结为:从内核或内存映射中读取和写入一个大文件。
我找到了很多库,但我找不到一个允许我进行多线程顺序读写的库。我想要做的是让多个线程附加到文件/数据帧(顺序无关紧要,无论如何都应该为下游应用程序改组)。然后在阅读时我只需要顺序阅读(没有切片,没有索引),但应该能够再次提供多个线程。
我发现/想出了以下解决方案:
csv
:不是一种选择,因为存储浮点数会导致精度损失(处理编码和转义也很糟糕)numpy.memmep
: 你需要提前知道数组的大小,无论是读取还是写入,追加似乎并不简单。dask
:我找不到附加到数据帧的方法,它总是在附加时创建一个新的数据帧,而且一个新的数据帧似乎没有文件支持。这看起来很适合阅读,但没有记录创建新的核心数据框。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.
所以它似乎不可能?joblib
: 同样的故事,阅读是,迭代写作不是。blaze
: 也没有附加行vaex
: 没有附加行。为什么‽</li>
他们都支持核心读取,这很好,但我需要先以特定的文件格式(写入)获取它——我在这里缺少什么?
看起来多线程编写是一个难题。但是即使增量写入单线程,但多线程读取已经不错了,但似乎没有库支持呢?
解决方案
多线程顺序写入可能容易出错。大多数系统通常更喜欢 Parquet 之类的格式,这些格式允许它们将每个数据块写入不同的文件。
如果您想进行实际的并行顺序写入,您将不得不进行某种锁定,并且您可能在更大的一体机系统方面靠自己。
推荐阅读
- swift - 无法构建 Objective-C 模块 'Firebase' - swift
- java - GridBagLayout 上的摆动替换组件
- javascript - 如何定义要调用的函数:function1().function2()?
- kubernetes - Helm install, Kubernetes - 如何等待 Pod 准备好?
- python - python使用for循环创建层次结构
- python - 使用 Python 处理多个 PDF 中的特定值并将其转换为 1 个 excel 工作表
- android - 是否可以使用 Andriod.bp 构建 android 应用程序
- c - 使用strtok解析C中的字符串并存储在数组中
- java - Firebase Cloud Firestore 遵循参考
- sql-server - 是否可以创建一个使用现有表的列的“TYPE ... TABLE”?