读取17K文本文件并将其保存在RAM中供以后使用

时间:2017-11-29 10:02:25

标签: python

我有一个for循环遍历 17K 文本文件 100 次(epochs),

在for循环之前,我想在RAM中读取并打开它们(缓存它们),因此我将能够在for循环中访问它们(非常快< /强>)。

您对这种情况有任何想法吗?

2 个答案:

答案 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