Python 3.x 在python内存中读取大量文件(20k+;)时出错

Python 3.x 在python内存中读取大量文件(20k+;)时出错,python-3.x,file,Python 3.x,File,我正试图使用python从我的计算机读取大量20k+的文件,但我一直收到这个内存错误(详细信息如下)。虽然我有16GB的RAM,其中8GB或更多的内存一直是空闲的,所有文件的大小只有270Mb。我尝试过许多不同的解决方案,如pandasread\u csv()使用open(file\u path)分块读取。read(100)和其他许多解决方案,但我无法读取文件。在阅读列表中的文件后,我必须创建一个单词库。下面是到目前为止我的代码。我们将非常感谢您的帮助 import os import pand

我正试图使用python从我的计算机读取大量20k+的文件,但我一直收到这个内存错误(详细信息如下)。虽然我有16GB的RAM,其中8GB或更多的内存一直是空闲的,所有文件的大小只有270Mb。我尝试过许多不同的解决方案,如pandas
read\u csv()
使用
open(file\u path)分块读取。read(100)
和其他许多解决方案,但我无法读取文件。在阅读列表中的文件后,我必须创建一个单词库。下面是到目前为止我的代码。我们将非常感谢您的帮助

import os
import pandas as pd

collectionPath = r"C:\Users\Asghar Nazir\OneDrive - Higher Education Commission\MSDS\S1\IR\assignment\ACL txt"

listOfFilesInCollection = os.listdir(collectionPath)

def wordList(file):
    list_of_words_from_file =[]
    for line in file:
        for word in line.split():
            list_of_words_from_file.append(word)
    return list_of_words_from_file


list_of_file_word_Lists = {}
file=[]
for file_name in listOfFilesInCollection:
    filePath = collectionPath + "\\" + file_name
    with open(filePath) as f:
        for line in f:
            file.append(line)
    list_of_file_word_Lists[file_name]=wordList(file)
print(list_of_file_word_Lists)
我得到的错误

回溯(最近一次调用):文件“C:/Users/Asghar Nazir/PycharmProjects/pythonProject/IRAssignment1/init.py”,行 25,在 文件列表单词列表[文件名]=单词列表(文件)文件“C:/Users/Asghar Nazir/PycharmProjects/pythonProject/IRAssignment1/init.py”,行 14,在单词表中 从文件中列出单词。附加(单词)MemoryError


您可能希望在循环开始时移动
文件=[]
,因为您当前正在添加打开的每个新文件的行,而没有先删除所有以前文件的行

然后,很可能会有更有效的方法,这取决于您试图实现的目标。如果单词的顺序无关紧要,那么可以使用
dict
collections.Counter
而不是
list
来避免相同字符串的重复。如果单词的顺序和频率都不重要,那么使用
set
可能会更好

最后,由于您可能会在多个文件中找到大多数单词,请尝试在内存中只存储其中的每个单词一次。这样,您将能够扩展比仅20k文件更高的文件:16Gib的RAM中有足够的空间


请记住,Python有很多固定的开销和隐藏的成本:低效的数据结构的成本可能比您预期的要高。

在不知道文件内容的情况下,很难说出内存问题的原因。也许这足以使您的代码更高效。例如:split()-函数本身可以处理多行。所以你不需要一个循环。在python中,使用列表理解始终是一个好主意

下面的代码应该返回您想要的内容,我看不出您使用它时内存不足的原因。除此之外,Arkanosis对数据类型重要性的暗示非常有效。这取决于你想用这些话达到什么目的

from pathlib import Path

def word_list_from_file(path):
    with open(path, 'rt') as f:
        list_words = f.read().split()
    return list_words
    
path_dir = Path(r"C:\Users\Asghar Nazir\OneDrive - Higher Education Commission\MSDS\S1\IR\assignment\ACL txt")
dict_file_content = {
    str(path.name): word_list_from_file(path)
    for path in path_dir.rglob("*.txt")
}

注:我不确定pathlib模块在windows中是如何工作的。但据我所知,此代码段与平台无关。

非常感谢您的帮助。现在,我已将列表移动到循环的开头。对于第二个建议,我需要一份清单。我仍然收到内存错误。我的程序运行了1到1.5分钟,然后显示错误。我的文件大小在每个文件最大20Kb到30Kb之间。非常感谢您的帮助。我仍然收到内存错误。我的程序运行了1到1.5分钟,然后显示错误。我的文件大小在20Kb到30Kb之间,每个文件的最大大小都在20Kb到30Kb之间。所有文件都是文本files@Asghar这对我来说似乎很奇怪。也许它与OneDrive有关?但我想不出原因。如果将所有文件的内容写入本地磁盘,会发生什么情况?除此之外,我能想到的唯一解决办法就是分几个步骤来做list_paths=list(path_dir.rglob(“*.txt”)[0:1000]…`另一方面:270MB的单词列表可能不是您最终想要的。也许您可以对每个文件进行分析,而不是对所有文件进行分析,然后汇总结果?