我有一个for
循环遍历 17K 文本文件 100 次(epochs),
在for循环之前,我想在RAM中读取并打开它们(缓存它们),因此我将能够在for循环中访问它们(非常快< /强>)。
您对这种情况有任何想法吗?
答案 0 :(得分:0)
正如documentation所说:
要读取文件的内容,请调用f.read(size),其中会读取一些数量 数据并将其作为字符串返回。 size是可选的数字 论点。当大小被省略或为负时,整个内容 文件将被阅读并返回;如果文件是两次,这是你的问题 与机器的内存一样大。否则,最多大小字节是 阅读并返回。如果已到达文件末尾,则f.read() 将返回一个空字符串(&#34;&#34;)。
所以,只需使用file.read
方法。
或者,您可以使用mmap
答案 1 :(得分:0)
我绝不会建议将这么多文本文件存储在RAM中,大多数情况下,这会占用更多内存。相反,我建议重构你的for循环,这样你就不必多次迭代它们了。
由于您并不是说您需要更改文件,我建议将它们全部存储在以字符串作为键的字典中。如果您使用OrderedDict,那么如果文件名对您来说也不重要,您甚至可以遍历内容(使用.itervalues()
)。
在这种情况下,您可以使用for循环(create the list of filenames either directly using the according os functionality迭代文件名列表或预先提供它)并将所有文件读入字典:
import collections
d = collections.OrderedDict()
file_list = ["a", "b", "c"] # Fill data here or adapt for loop accordingly
for file_path in file_list:
d[file_path] = open(file_path, "r").read()
这不是一个完全匹配的解决方案,但可能会加速你一点点的替代方案: 我不知道您使用的文件,但是如果您可以区分输入文件,因为它们例如每个只包含一行,...你可以将它们全部复制到一个巨大的文件中,并且只能遍历这个文件,例如与
for line in huge_cache_file:
# your current logic here
这不会像使用你的RAM那样加速你,但它会摆脱打开和关闭17k文件一百次的开销。 在大缓存文件的末尾,您可以使用
再次跳转到开头huge_cache_file.seek(0)
如果换行不是一个选项,但你的文件有一个固定的长度,你仍然可以将它们复制在一起并迭代如下:
for file_content in huge_cache_file.read(file_length):
# your current logic here
如果文件的长度不同,您仍然可以执行此操作,但将每个文件的文件长度存储到一个数组中,使用这些存储的文件长度从缓存文件中读取:
file_lengths = [1024, 234, 16798704, ] # all file lengths in sequence here
for epoch in range(0, 100):
huge_cache_file.seek(0)
for file_length in file_lengths:
file_content = huge_cache_file.read(file_length)
# your current logic here