【问题标题】:Python: Can I write to a file without loading its contents in RAM?Python:我可以写入文件而不将其内容加载到 RAM 中吗?
【发布时间】:2019-11-19 04:05:51
【问题描述】:

有一个我想洗牌的大数据集。整个集合不适合 RAM,所以如果我可以同时打开多个文件(例如 hdf5、numpy),按时间顺序循环遍历我的数据并将每个数据点随机分配给其中一个堆(然后将每个桩)。

我对在 python 中处理数据非常缺乏经验,所以我不确定是否可以在不将其余内容保存在 RAM 中的情况下写入文件(一直使用 np.save 和 savez,但收效甚微)。

这可能吗,在 h5py 或 numpy 中,如果是,我该怎么做?

【问题讨论】:

  • @desertnaut 洗牌庞大的数据集与机器学习无关?
  • 读/写行?
  • 标签是关于问题的内容,而不是它的context;这么说来,ML 确实与“洗牌巨大的数据集”无关。如果这种改组与拟合您的模型有关,则该标记在这里是合适的 - 但这里不是这种情况。
  • 标签部分用于吸引该地区有经验的人。正如我所提到的,绝大多数对改组大型数据集感兴趣的人都会像我一样这样做,以帮助提高模型的性能。因此,我包含了这个标签,因为在机器学习方面有经验的人可能会遇到这个问题并解决它。这显然不是一个荒谬的标签,所以下次你想发出尖刻的评论时,不妨忍住。
  • 你可以使用 Dask 数组来分块你的数据docs.dask.org/en/stable/array-creation.html

标签: python numpy hdf5 h5py


【解决方案1】:

内存映射文件可以满足您的需求。他们创建了一个 numpy 数组,将数据留在磁盘上,只根据需要加载数据。完整的手册页是here。但是,使用它们的最简单方法是在对np.load 的调用中传递参数mmap_mode=r+mmap_mode=w+ 将文件留在磁盘上(请参阅here)。

我建议使用高级索引。如果您在一维数组arr 中有数据,则可以使用列表对其进行索引。所以arr[ [0,3,5]] 会给你arr 的第0、第3 和第5 个元素。这将使选择洗牌的版本更加容易。由于这会覆盖数据,因此您需要以只读方式打开磁盘上的文件,并创建副本(使用mmap_mode=w+)以放入混洗后的数据。

【讨论】:

  • 谢谢,这真的很有帮助,我会研究 mmap 和高级索引! :)
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多