结论: 似乎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)
Run Code Online (Sandbox Code Playgroud)
我认为减速的原因是因为有大量的文件.执行此功能1000次,时间不到一秒......但现在达到1分钟.
你怎么建议我解决这个问题?我是否更改了目录树结构?
我只需要快速访问这个庞大的文件池中的每个文件*
两个建议:
首先,涉及子目录的32深度嵌套的结构本质上是有缺陷的.假设您确实拥有"大约1000万个文件",那么一个级别的子目录应该是足够的(假设您使用的是现代文件系统).
第二:你说你有"大约1000万个文件",每个文件"包含一个整数字符串".假设它们是32位整数并且您直接存储它们而不是字符串,这相当于总数据集大小为40MiB(10M文件*每个文件4个字节).假设每个文件名长度为32个字节,则为此数据添加另一个320MiB的"密钥".
因此,您将能够轻松地将整个数据集放入内存中.我建议这样做,并对主存储器中保存的数据进行操作.除非有任何理由需要精心设计的目录结构,否则我建议将数据存储在一个文件中.