【问题标题】:Python 3.x: Multiprocess cannot serialize 'ExFileObject' objectPython 3.x:多进程无法序列化“ExFileObject”对象
【发布时间】:2016-12-01 07:57:04
【问题描述】:

我尝试从存档(tar)中读取 txt 文件并使用函数处理文件。我有很多文件,并决定使用多处理库来加快计算速度。但我收到错误“无法序列化 'ExFileObject' 对象”。下面是我的代码示例。 如何序列化“ExFileObject”对象或如何使用多处理库加速我的计算?我正在使用 Python 3.4

import tarfile
from multiprocessing import Process, Manager

def start():
    result = {}
    file_path = '...somepath'
    tar = tarfile.open(file_path, 'r')
    for file in tar:
        extr_file = tar.extractfile(file)
        p = Process(target=straight_calc, args=(extr_file, result)) #thows error
        p.start()
        p.join()
    print(result)

def straight_calc(file, result):
    content = file.readlines()
    for line in content:
        pass

if __name__ == '__main__':
    start()

【问题讨论】:

  • 至于使用多处理来“加快速度”,看来您实际上是在使事情变得有价值,因为您正在启动 一个 进程并等待它完成在继续之前。因此,您仍在按顺序工作,同时增加了为每个文件生成进程的开销。

标签: python multithreading multiprocessing


【解决方案1】:

您的示例代码对我来说很好用。我只会添加NoneType 检查,因为NoneType 没有readlines 属性,而tar.extractfile(file) 可能会返回NoneType 值。

import tarfile
from multiprocessing import Process, Manager

def start():
    result = {}
    file_path = '...somepath'
    tar = tarfile.open(file_path, 'r')
    for file in tar:
        extr_file = tar.extractfile(file)
        if extr_file is not None:
            p = Process(target=straight_calc, args=(extr_file, result))
            p.start()
            p.join()
    print(result)

def straight_calc(file, result):
    content = file.readlines()
    for line in content:
        pass

if __name__ == '__main__':
    start()

您可以尝试使用 picklestring = pickle.dumps(extr_file) 腌制您的 extr_file。在执行 Process 之前腌制 extr_file 应该会抛出一个更有用的异常。

【讨论】:

  • 我试过d = pickle.dump(extr_file, open( "save.p", "wb" )),但它也抛出错误“无法序列化'ExFileObject'对象”。另外,当我调用函数straight_calc(extr_file, result) 时,它可以工作。因此,主要问题是使用多进程(进程或其他)调用函数,以加快计算速度。
  • 我用 tar 存档中的一些文本文件尝试了您的代码。我无法重现“无法序列化 'ExFileObject' 对象”。您的 tar 文件是如何组织的。您要读取什么类型的文件。
  • 我在 Google Drive 上存档了drive.google.com/file/d/0B1myD5vqCbC2cm04elRZN1dPQ2M/… 存档中有包含 txt 文件的文件夹。
  • 仍然无法重现。也许还有其他问题。
  • 上面我写了一个代码示例,确实我的straight_calc方法在另一个模块中。它会抛出错误吗?我将尝试操作调用方法,并尝试使用文件参数调用该方法,然后将其提取。当我有更多信息时,我会通知你。
猜你喜欢
  • 2017-09-26
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2011-08-22
  • 2018-04-25
相关资源
最近更新 更多