Python:数百万个小文件的读写速度缓慢

2024-05-07

结论:看来 HDF5 是适合我的目的的方法。基本上 ”HDF5 是一种用于存储和管理数据的数据模型、库和文件格式。“并且旨在处理令人难以置信的大量数据。它有一个名为 python-tables 的 Python 模块。(链接在下面的答案中)

HDF5 在保存大量数据方面的效果提高了 1000%。不过,从 2 亿行中读取/修改数据是一件痛苦的事情,所以这是下一个要解决的问题。


我正在构建包含大量子目录和文件的目录树。大约有 1000 万个文件分布在十万个目录中。每个文件都位于 32 个子目录下。

我有一个 python 脚本来构建这个文件系统并读取和写入这些文件。问题是,当我达到超过一百万个文件时,读写方法变得极其缓慢。

这是我的函数,它读取文件的内容(该文件包含一个整数字符串),向其中添加一定的数字,然后将其写回原始文件。

def addInFile(path, scoreToAdd):
    num = scoreToAdd
    try:
        shutil.copyfile(path, '/tmp/tmp.txt')
        fp = open('/tmp/tmp.txt', 'r')
        num += int(fp.readlines()[0])
        fp.close()
    except:
        pass
    fp = open('/tmp/tmp.txt', 'w')
    fp.write(str(num))
    fp.close()
    shutil.copyfile('/tmp/tmp.txt', path)
  • 关系数据库访问这些数据似乎太慢,因此我选择了文件系统方法。
  • 我之前尝试过对这些执行 Linux 控制台命令,但速度慢得多。
  • 我首先将文件复制到临时文件,然后访问/修改它,然后将其复制回来,因为我发现这比直接访问文件更快。
  • 将所有文件放入 1 个目录(以 reiserfs 格式)会导致访问文件时速度过慢。

我认为速度变慢的原因是文件太多。执行此函数 1000 次的时间不到一秒..但现在达到了 1 分钟。

你建议我如何解决这个问题?我要更改目录树结构吗?

我所需要的只是快速访问这个非常大的文件池中的每个文件*


我知道这不是对您问题的直接答案,但它是对您问题的直接解决方案。

你需要使用类似的东西进行研究HDF5 http://www.hdfgroup.org/HDF5/。它专为具有数百万个单独数据点的分层数据类型而设计。

你真的很幸运,因为有很棒的 HDF5 Python 绑定,称为pytables http://www.pytables.org/。 我以非常相似的方式使用它并取得了巨大的成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:数百万个小文件的读写速度缓慢 的相关文章

随机推荐

  • 使用 Google Guava 进行不区分大小写的排序

    目前 我在两个不同的地方使用以下两段代码来创建一个排序的 不可变的列表 return Ordering natural immutableSortedCopy iterable and return Ordering usingToStri
  • 将逻辑回归从 R 迁移到 rpy2

    我正在尝试使用 ryp2 进行逻辑回归 我设法执行它 但不知道如何从结果中提取系数和 p 值 我不想在屏幕上打印这些值 而是创建一个函数来独立使用它们 import rpy2 robjects as ro mydata ro r data
  • 验证 C# 中的小数是否存储在 SQL Server 中

    我有一个十进制数据库列decimal 26 6 据我所知 这意味着精度为 26 小数位数为 6 我认为这意味着该数字的长度总共可以是 26 位数字 其中小数点后可以有 6 位数字 在我的 WPF C 前端中 我需要验证传入的小数 以便我可以
  • 如何忽略在另一个任务的 run() 内触发的 Luigi 任务的失败

    考虑以下任务 import luigi class YieldFailTaskInBatches luigi Task def run self for i in range 5 yield FailTask i j for j in ra
  • 为什么 Eclipse 要求我在 java 代码中设置(任意)括号?

    我目前正在尝试弄清楚如何使用 Eclipse 在 java 中对 Escape 模型进行编程 我对 Escape 和 Eclipse 很陌生 自从我用 java 编程以来已经有一段时间了 所以如果这是一个愚蠢的问题 请原谅 基本上 我一直被
  • 为什么显示后无法清除错误消息-axios-react

    第一个问题的背景 https stackoverflow com questions 72929201 react axios showing message to user 72929320 我正在展示使用localhost 3000 u
  • MS-sql 检索年龄最大的学生的成绩数据

    在此输入图像描述 https i stack imgur com mJ8aT png 在此输入图像描述 https i stack imgur com guYsU png 在此输入图像描述 https i stack imgur com 7
  • 如果h2表不存在则插入

    我正在使用H2 我想将一个值插入到表中 如果它不存在 我使用以下命令创建表 CREATE TABLE IF NOT EXISTS types type VARCHAR 15 NOT NULL UNIQUE 我想做一些类似的事情 REPLAC
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 调试 Android 库中的本机代码

    我的工作空间布局是 ApplicationLibrary AndroidManifest xml jni libs src Application AndroidManifest xml ant properties 如何在 Eclipse
  • Excel Active-X 按钮无法单击

    我有一个在 Excel 中应该可以点击的按钮 当我尝试单击它时 什么也没有发生 我注意到 如果我单击并按住右下角的鼠标 则会出现第二个按钮 这种情况过去发生过 当我移动鼠标单击该按钮时 我可以单击 一切都会正常 但这一次 当我移动鼠标时 按
  • 更新行时获取电子邮件用户值

    我和我的团队有电子表格 当他们更新行 基于他们使用的帐户 时 如何 自动 获取电子邮件用户值 因此 每次他们更新 任务 列时 电子邮件 列都会自动更新 就像下表一样电子表格 https i stack imgur com lgDhF png
  • 如何在 Docker for Windows 中设置共享驱动器?

    如何在 Docker for Windows 中设置共享驱动器 我正在使用最新版本 18 Stable 和 Edge 我的设置屏幕如下所示 它缺少一些选项 如共享驱动器 高级和网络 如第二张图片所示 为什么我缺少这些选项 My settin
  • 如何在 ReactJs 中使用 Hooks useState 编写多行状态

    React 16 9 我知道这class component state class JustAnotherCounter extends Component state count 0 相当于使用Hooks useState functi
  • 在 dart 中,集合如何确定两个对象相等?

    我不明白集合如何确定两个对象何时相等 更具体一点 什么时候add集合的方法 确实添加了一个新对象 并且什么时候它不作用一个新对象 因为该对象已经在集合中 例如 我有以下类的对象 class Action final Function fun
  • iOS 安全性将带有密码的数据发送至服务器或从服务器发送数据

    我正在构建一个应用程序 需要在服务器执行任何操作之前从用户设备发送密码以在服务器上进行身份验证 事情是这样的 用户的手机上有一个纯文本密码 该密码也在服务器中以 bcrypt 二进制文件的形式存在 用户想要从数据库中获取某些内容 因此用户通
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • GLSL 棋盘图案

    我想用跳棋来遮蔽四边形 f P 下限 Px 下限 Py mod2 我的四边形是 glBegin GL QUADS glVertex3f 0 0 0 0 glVertex3f 4 0 0 0 glVertex3f 4 4 0 0 glVert
  • x % 2 == 0 是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我确信这是
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF