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

2024-03-29 04:46:55 发布

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

Conclusion: It seems that HDF5 is the way to go for my purposes. Basically "HDF5 is a data model, library, and file format for storing and managing data." and is designed to handle incredible amounts of data. It has a Python module called python-tables. (The link is in the answer below)

HDF5 does the job done 1000% better in saving tons and tons of data. Reading/modifying the data from 200 million rows is a pain though, so that's the next problem to tackle.


我正在建立目录树,其中有大量的子目录和文件。大约有1000万个文件分布在10万个目录中。每个文件都在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控制台命令,但是速度慢了很多。
  • 我先将文件复制到一个临时文件,然后访问/修改它,然后再将其复制回,因为我发现这比直接访问文件快。
  • 将所有文件放入一个目录(reiserfs格式)会导致访问文件时速度过慢。

我认为减速的原因是因为文件太多了。在不到一秒的时间内执行此功能1000次。。但现在已经到了1分钟。

你建议我怎么解决这个问题?是否更改目录树结构?

我只需要快速访问这个巨大的文件池中的每个文件*


Tags: and文件thetopath目录txtdata
3条回答

我建议您重新考虑您的方法,使用大量非常小的文件必然会给您带来严重的性能问题。根据程序的用途,某种类型的数据库可能要高效得多。

如果你正在做大量的I/O,你也可以扔更多的硬件在这个问题上,使用固态硬盘或保持所有的数据在RAM(显式或缓存)。在这种情况下,单靠硬盘驱动器是不可能获得良好性能的。

我从未使用过它,但例如Redis是一个持久的键值存储,应该非常快。如果你的数据符合这个模型,我肯定会尝试这个或类似的东西。您将在这个article中找到一些性能数据,这将使您了解可以达到的速度。

我知道这不是对你问题的直接回答,但它是对你问题的直接解决。

你需要用类似HDF5的东西来研究。它是专为具有数百万个单独数据点的层次数据类型而设计的。

你真的很幸运,因为HDF5有很棒的Python绑定,叫做pytables。 我也用过类似的方法,并取得了巨大的成功。

两条建议:

首先,包含32个深嵌套子目录的结构本身就有缺陷。假设您真的有“大约1000万个文件”,那么一级子目录就足够了(假设您使用的是现代文件系统)。

秒:你说你有“大约1000万个文件”,每个文件“包含一个整数字符串”。假设这些是32位整数,并且您直接存储它们而不是作为字符串存储,那么数据集的总大小为40MiB(10M个文件*每个文件4个字节)。假设每个文件名都是32字节长,那么再为这个数据添加一个320MiB的“keys”。

因此,您可以轻松地将整个数据集放入内存中。我建议这样做,并对保存在主存储器中的数据进行操作。除非有任何理由需要一个详细的目录结构,否则我进一步建议将数据存储在一个文件中。

相关问题 更多 >