Python 3.x 在python内存中读取大量文件(20k+;)时出错
我正试图使用python从我的计算机读取大量20k+的文件,但我一直收到这个内存错误(详细信息如下)。虽然我有16GB的RAM,其中8GB或更多的内存一直是空闲的,所有文件的大小只有270Mb。我尝试过许多不同的解决方案,如pandasPython 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
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的单词列表可能不是您最终想要的。也许您可以对每个文件进行分析,而不是对所有文件进行分析,然后汇总结果?