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

我的Python代码是从XML文件中提取信息并将其加载到数据库中。这些文件命名为数字 ,等等,我有大约100万个文件。11582.xml5300593.xml


我已经构建了代码,它工作正常。我遇到了一个问题,代码没有占用完整的处理器/内存/磁盘容量。我的处理器应该使用20%最大。


我问了这里和其他地方,发现我必须使用多线程才能使用全部容量。因此,我必须更改脚本以采用多线程。我做到了,但仍然没有发挥到最大作用。


我做错了什么?以及如何解决它?


我的代码:


import pymssql

import pyodbc

import pandas as pd

import thread

import glob

import xml.etree.ElementTree as ET


conn = 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()


千巷猫影
浏览 140回答 2
2回答

catspeake

为什么不生成文件列表,然后使用池处理它们?import multiprocessingdef 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 iteratorfilename_iterator = glob.iglob("H:/datas_Output/xmldata/", recursive=True)with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:    results = pool.map(ExtractData, filename_iterator)

动漫人物

Python多线程不是“真实的”。首先,有一个“全局解释器锁”(GIL),它只允许一个线程同时运行py。此外,python线程不使用独立的真实处理器内核。主要好处是一个线程可以在外部I / O操作上被阻止;其他线程可以执行某些操作。但是,在其他环境(如 JVM(Java、柯特林等)中,支持实际线程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python