gpt4 book ai didi

python - 循环读取 XML 文件最终会导致内存错误

转载 作者:行者123 更新时间:2023-12-04 09:13:05 24 4
gpt4 key购买 nike

案例:
我正在尝试读取一个 XML 文件,使用 BeautifulSoup 从中提取少量数据,将数据添加到字典中,关闭文件,然后进入下一个文件。一旦我提取了我需要的数据,文件应该被关闭并从内存中释放。
问题:
该程序最终将因内存错误而停止,并且任务管理器清楚地显示每个文件之后的内存消耗量都在增加,这让我相信我的文件没有正确关闭或从内存中释放。在我的环境中,这将在读取大约 200 个文件后发生。
我尝试过但没有成功的事情:

  • 用 gc.collect() 收集垃圾(似乎没有什么区别)
  • 用soup.decompose() 分解文件(似乎没什么区别)
  • 各种不同大小的文件
  • SoupStrainer(有/没有它几乎没有区别)

  • 我发现了 2 个“解决方案”:
  • 强制脚本在一段时间后自行重启(不是最佳的)
  • 64 位版本和更多物理内存(非最佳)

  • 文件信息:
  • 大小从 100kb 到 5mb
  • 每个文件 10.000 到 70.000 行。
  • 标准 .xml 格式

  • 邮箱 来自文件的 XML 结构/片段示例。 (最多可以有 70.000 行):
    <!-- language: xml -->
    <Partner>
    <Language>en-US</Language>
    <PartnerRole>stackoverflow1</PartnerRole>
    <IsSalesAreaDependent>True</IsSalesAreaDependent>
    <ContactPerson>
    <ContactPerson>
    <Language>en-US</Language>
    </ContactPerson>
    </ContactPerson>
    <InheritFromSoldTo>True</InheritFromSoldTo>
    <SalesAreaData>
    <SalesAreaData>
    <Language>en-US</Language>
    <Valid>False</Valid>
    <SalesOrganization>stackoverflow2</SalesOrganization>
    <DistributionChannel>stackoverflow3</DistributionChannel>
    <SalesDivision>stackoverflow4</SalesDivision>
    <CustomerGroup />
    <Currency>stackoverflow5</Currency>
    <PriceGroup />
    <PriceList>stackoverflow6</PriceList>
    <ShippingConditions />
    <Plant />
    <PaymentTerms />
    </SalesAreaData>
    </SalesAreaData>
    <CustomerHierarchy />
    </Partner>
    代码:
    for fname in glob.glob(path+"/Quotes/**/*.quote"): #Further define path

    with open(fname, encoding="utf8") as open_file:

    gc.collect()
    counter += 1
    contents = open_file.read()
    soup = BeautifulSoup(contents, 'lxml')

    try:
    results = ("("+str(counter)+") " + " Ref: " + soup.quickref.string + " Last modified: " + soup.modifieddate.string)
    bsize = os.path.getsize(fname)
    totalsize += bsize

    tempdata = (soup.modifieddate.string, soup.quickref.string, soup.ownerusername.string, soup.companyname.string, soup.totalnetvalue.string, fname)
    dictHolder[counter] = tempdata

    except AttributeError:

    results = "("+ str(counter) + ")" + "Invalid data / corrupted file, please check: " + fname
    corruptCounter += 1

    soup.decompose()
    gc.collect()
    print (results)
    2020 年 10 月 8 日:问题已通过切换到 xml.etree.elementtree 模块“解决”,并不能真正算作答案或解决方案,但如果将来有人遇到同样的问题并阅读此问题,请尝试上面的模块。

    最佳答案

    我对beautifulsoup 了解不多……但是用pandas 阅读数千个csv 文件并将其存储在字典中对我来说很有效,只需阅读并将其添加到字典中即可。
    您可以尝试使用 pandas 读取文件并检查问题是否出现在读取第 200 个文件时。如果是这种情况,我假设它是 RAM 问题。

    关于python - 循环读取 XML 文件最终会导致内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63314468/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com