[英]Using BeautifulSoup on very large HTML file - memory error?
[英]Using BeautifulSoup but getting memory error from large file
我有一个非常大的csv文件,其中包含几个HTML代码字符串。 我使用BeautifulSoup只提取<p>
标签中的代码。 我的代码似乎适用于几个示例,除非我在完整的csv文件上运行它时出现内存错误。 csv文件大约是6 GB。 这是我的代码
def import_data():
doc=[]
with open('input_file.csv','rb') as f:
reader=csv.reader(f)
for row in reader:
doc.append((row[0],row[2]))
return doc
def main():
data=import_data()
desc=[]
for i in data:
soup = BeautifulSoup(i[1], 'html')
desc.append([i[0],' '.join(el.string for el in soup.find_all('p', text=True))])
with open("output_file.csv",'a') as the_file:
writer=csv.writer(the_file,dialect='excel')
writer.writerow(desc)
if __name__ == '__main__':
main()
我可以看到为什么我的内存不足,因为我基本上在两个地方( 数据和desc )保存6 GB文件。 我知道我能够将其中一个保存在内存中,因为我能够毫无问题地导入数据。 但你怎么建议我绕过这个? 我应该尝试用BeautifulSoup输出替换第二列而不是两个结构吗? 或者我应该做什么,我逐行读取输入文件,我读取一行,对其执行BeautifulSoup转换,然后导出它(所以我一次只有一行内存)。 谢谢,
您可以查看内存映射文件,它们可以帮助您避免将整个输入文件放在内存中。
你的第二个建议可能是最好的,假设CSV中的每个项目都是它自己的独立HTML集合,为什么不迭代thecv的每一行,解析它,然后读取下一行,只保留CSV的当前行内存,而只存储p
标签的内容?
#pseudocode
p_tags = []
for row in csv.read_lines:
result = html_parse(row)
p_tags.append(result)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.