为了账号安全,请及时绑定邮箱和手机立即绑定

多线程不使用完整的处理器/内存/磁盘容量

多线程不使用完整的处理器/内存/磁盘容量

千巷猫影 2022-09-27 16:17:07
我的Python代码是从XML文件中提取信息并将其加载到数据库中。这些文件命名为数字 ,等等,我有大约100万个文件。11582.xml5300593.xml我已经构建了代码,它工作正常。我遇到了一个问题,代码没有占用完整的处理器/内存/磁盘容量。我的处理器应该使用20%最大。我问了这里和其他地方,发现我必须使用多线程才能使用全部容量。因此,我必须更改脚本以采用多线程。我做到了,但仍然没有发挥到最大作用。我做错了什么?以及如何解决它?我的代码:import pymssqlimport pyodbcimport pandas as pdimport threadimport globimport xml.etree.ElementTree as ETconn = pyodbc.connect('Driver={SQL Server};'                      'Server=Server123;'                      'Database=NLP;'                      'Trusted_Connection=yes;')cursor = conn.cursor()def ExtractData(ThreadName):    for file in glob.glob("H:\\datas_Output\\xmldata\\" & ThreadName & "*.xmi"):        filename = file[24:-8]        tree = ET.parse(file)        root = tree.getroot()        for Tag in ['Kitkat', 'Snickers', 'Bounty']:            iTag = '{textsem.ecore}' + Tag            for country in root.findall(iTag):                XMIID = country.get('{XMI}id')                sofa = country.get('sofa')                cursor.execute("INSERT INTO Tags (filename,tag,xmiid,sofa) VALUES (?,?,?,?)", filename, Tag, XMIID, sofa)try:   thread.start_new_thread( ExtractData, ("1") )   thread.start_new_thread( ExtractData, ("2") )except:   print("Error: unable to start thread")conn.commit()
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

为什么不生成文件列表,然后使用池处理它们?


import multiprocessing


def ExtractData(file):

    filename = file[24:-8]

    tree = ET.parse(file)

    root = tree.getroot()


    for Tag in ['Kitkat', 'Snickers', 'Bounty']:

        iTag = '{textsem.ecore}' + Tag

        for country in root.findall(iTag):

            XMIID = country.get('{XMI}id')

            sofa = country.get('sofa')

            cursor.execute("INSERT INTO Tags (filename,tag,xmiid,sofa) VALUES (?,?,?,?)", filename, Tag, XMIID, sofa)


# if there are millions of files, you might want an iterator

filename_iterator = glob.iglob("H:/datas_Output/xmldata/", recursive=True)


with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:

    results = pool.map(ExtractData, filename_iterator)


查看完整回答
反对 回复 2022-09-27
?
动漫人物

TA贡献1815条经验 获得超10个赞

Python多线程不是“真实的”。首先,有一个“全局解释器锁”(GIL),它只允许一个线程同时运行py。此外,python线程不使用独立的真实处理器内核。主要好处是一个线程可以在外部I / O操作上被阻止;其他线程可以执行某些操作。

但是,在其他环境(如 JVM(Java、柯特林等)中,支持实际线程。


查看完整回答
反对 回复 2022-09-27
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信