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)
我认为减速的原因是因为文件太多了。在不到一秒的时间内执行此功能1000次。。但现在已经到了1分钟。
你建议我怎么解决这个问题?是否更改目录树结构?
我只需要快速访问这个巨大的文件池中的每个文件*
我建议您重新考虑您的方法,使用大量非常小的文件必然会给您带来严重的性能问题。根据程序的用途,某种类型的数据库可能要高效得多。
如果你正在做大量的I/O,你也可以扔更多的硬件在这个问题上,使用固态硬盘或保持所有的数据在RAM(显式或缓存)。在这种情况下,单靠硬盘驱动器是不可能获得良好性能的。
我从未使用过它,但例如Redis是一个持久的键值存储,应该非常快。如果你的数据符合这个模型,我肯定会尝试这个或类似的东西。您将在这个article中找到一些性能数据,这将使您了解可以达到的速度。
我知道这不是对你问题的直接回答,但它是对你问题的直接解决。
你需要用类似HDF5的东西来研究。它是专为具有数百万个单独数据点的层次数据类型而设计的。
你真的很幸运,因为HDF5有很棒的Python绑定,叫做pytables。 我也用过类似的方法,并取得了巨大的成功。
两条建议:
首先,包含32个深嵌套子目录的结构本身就有缺陷。假设您真的有“大约1000万个文件”,那么一级子目录就足够了(假设您使用的是现代文件系统)。
秒:你说你有“大约1000万个文件”,每个文件“包含一个整数字符串”。假设这些是32位整数,并且您直接存储它们而不是作为字符串存储,那么数据集的总大小为40MiB(10M个文件*每个文件4个字节)。假设每个文件名都是32字节长,那么再为这个数据添加一个320MiB的“keys”。
因此,您可以轻松地将整个数据集放入内存中。我建议这样做,并对保存在主存储器中的数据进行操作。除非有任何理由需要一个详细的目录结构,否则我进一步建议将数据存储在一个文件中。
相关问题 更多 >
编程相关推荐