首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多处理划分和征服etree.iterparse

使用多处理划分和征服etree.iterparse
EN

Stack Overflow用户
提问于 2011-01-22 20:14:42
回答 1查看 712关注 0票数 0

因此,让我们设想一个大的xml文档(文件大小>100mb),我们想要使用cElementTree.iterparse进行迭代解析。

但英特尔向我们承诺的所有这些核心都是值得的,我们如何使用它们呢?这是我想要的:

代码语言:javascript
复制
from itertools import islice
from xml.etree import ElementTree as etree

tree_iter = etree.iterparse(open("large_file.xml", encoding="utf-8"))

first = islice(tree_iter, 0, 10000)
second = islice(tree_iter, 10000)

parse_first()
parse_second()

这似乎有几个问题,尤其是iterparse()返回的迭代器似乎拒绝切片。

有没有办法将大型xml文档的解析工作划分为两个或四个独立的任务(而不将整个文档加载到内存中?其目的是在单独的处理器上执行任务。

EN

回答 1

Stack Overflow用户

发布于 2011-01-22 20:24:37

我认为你需要一个很好的线程池和一个任务队列来完成这个任务。我发现(并使用)了这个非常好的版本(它是用python3编写的,但是转换到2.x应该不会太难):

代码语言:javascript
复制
# http://code.activestate.com/recipes/577187-python-thread-pool/

from queue import Queue
from threading import Thread

class Worker(Thread):
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True
        self.start()

    def run(self):
        while True:
            func, args, kargs = self.tasks.get()
            try: func(*args, **kargs)
            except Exception as exception: print(exception)
            self.tasks.task_done()

class ThreadPool:
    def __init__(self, num_threads):
        self.tasks = Queue(num_threads)
        for _ in range(num_threads): Worker(self.tasks)

    def add_task(self, func, *args, **kargs):
        self.tasks.put((func, args, kargs))

    def wait_completion(self):
        self.tasks.join()

现在,您只需在iterparse上运行循环,并让线程池为您分配工作。使用它很简单,如下所示:

代码语言:javascript
复制
def executetask(arg):
    print(arg)

workers = threadpool.ThreadPool(4) # 4 is the number of threads
for i in range(100): workers.add_task(executetask, i)

workers.wait_completion() # not needed, only if you need to be certain all work is done before continuing
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4767741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档