【发布时间】:2010-06-13 08:31:16
【问题描述】:
结论: 看来 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 分钟。
你建议我如何解决这个问题?我要更改我的目录树结构吗?
我只需要快速访问这个庞大的文件池中的每个文件*
【问题讨论】:
-
256^32!!!那是1E77!!!仅用于目录就需要 4E68 1TB 磁盘驱动器!!!如果您的意思是“2^32”,那么您很幸运,您只需要大约 4 PB 的存储空间。
-
请检查您的数字,您的磁盘上不可能有 256^32 个目录,甚至是当前磁盘的 2^32 个目录,并且仍然在寻求帮助。换句话说,你不会在不知道如何正确处理它们的情况下购买这么多或这么大的磁盘,所以数字显然是错误的。
-
另外,您是说每个文件只有几个字节长,但抱怨当文件为 1GB 时处理需要时间?
-
从描述中,我了解到 OP 正在制作 256 个目录,每个目录包含 256 个目录,...,32 层深度。最后一级包含 256 个小文件。
-
我猜还是有些混乱。假设 Adrien 对拥有 32 深 256 树的解释,您将“略”超过 10 ^ 77 个目录,或者只是“略”高于 2 ^ 256。不幸的是,没有 256 位文件系统,所以你必须等到那些成为时尚(提示:他们不会)。一旦你有了这样一个 256 位的文件系统,你只需要克服boil the oceans 的小障碍,两次,然后你就设置好了你的目录结构。