亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程不使用完整的處理器/內存/磁盤容量

多線程不使用完整的處理器/內存/磁盤容量

千巷貓影 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 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號