Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS Sagemaker和S3中的多处理问题_Python_Python 3.x_Amazon Web Services_Amazon S3_Multiprocessing - Fatal编程技术网

Python AWS Sagemaker和S3中的多处理问题

Python AWS Sagemaker和S3中的多处理问题,python,python-3.x,amazon-web-services,amazon-s3,multiprocessing,Python,Python 3.x,Amazon Web Services,Amazon S3,Multiprocessing,我有大约2000个XML文件,它们在AWS S3存储桶中经过gzip压缩(即.*.XML.gz),每个文件大约20mb。bucket只包含这些文件。我正处于项目的探索阶段,我主要想检查任何文件中是否存在某个字符串,并将其打印出来。比如说,我想检查是否出现在任何给定的文件中,并打印它出现的位置(我知道出现的地方很少,如果有的话) 我想使用AWS SageMaker运行一些简单的python代码来实现我的目标。由于任务是可并行的(每个文件都可以单独分析),因此我尝试使用多处理模块而不是for循环 我

我有大约2000个XML文件,它们在AWS S3存储桶中经过gzip压缩(即.*.XML.gz),每个文件大约20mb。bucket只包含这些文件。我正处于项目的探索阶段,我主要想检查任何文件中是否存在某个字符串,并将其打印出来。比如说,我想检查
是否出现在任何给定的文件中,并打印它出现的位置(我知道出现的地方很少,如果有的话)

我想使用AWS SageMaker运行一些简单的python代码来实现我的目标。由于任务是可并行的(每个文件都可以单独分析),因此我尝试使用多处理模块而不是for循环

我最初编写了这个循环:

import boto3
import gzip

s3 = boto3.resource("s3")
my_bucket = s3.Bucket('my-bucket-name')
keys = [my_bucket_object.key for my_bucket_object in my_bucket.objects.all()]

for key in keys:
    # I open each file, uncompress it and read it
    obj = s3.Object('my-bucket-name', key)

    with gzip.GzipFile(fileobj=obj.get()["Body"]) as gzipfile:
        content = gzipfile.read()
        # Here I convert the binary to text and split the lines
        content = str(content).split('\\n')
        for line in content:
            if '<copyright>' in line:
                print(line)
导入boto3
导入gzip
s3=两种资源(“s3”)
my_bucket=s3.bucket('my-bucket-name'))
keys=[my_bucket\u object.key用于my_bucket\u对象在my_bucket.objects.all()中]
对于键入键:
#我打开每个文件,解压缩并读取它
obj=s3.Object('my-bucket-name',key)
使用gzip.gzip文件(fileobj=obj.get()[“Body”])作为gzip文件:
content=gzipfile.read()
#在这里,我将二进制文件转换为文本并拆分行
content=str(content).split('\\n')
对于内容中的行:
如果“”在第行中:
打印(行)
这是可行的,尽管它当然非常缓慢。我尝试使用多处理进行并行化,如下所示:

import multiprocessing as mp

def checker(key):
    obj = s3.Object('my-bucket-name', key)
    with gzip.GzipFile(fileobj=obj.get()["Body"]) as gzipfile:
        content = gzipfile.read()
        content = str(content).split('\\n')      
        lines = []
        for line in content:
            if '<copyright>' in line:
                lines.append(line)
    return lines

pool = mp.Pool(mp.cpu_count())
result = pool.map(checker, keys)
将多处理导入为mp
def检查器(钥匙):
obj=s3.Object('my-bucket-name',key)
使用gzip.gzip文件(fileobj=obj.get()[“Body”])作为gzip文件:
content=gzipfile.read()
content=str(content).split('\\n')
行=[]
对于内容中的行:
如果“”在第行中:
行。追加(行)
回程线
pool=mp.pool(mp.cpu\u count())
结果=pool.map(棋盘格、键)
但这给了我以下错误:

An error was encountered:
Can't pickle <function checker at 0x7f0c69ed38c8>: attribute lookup checker on __main__ failed
Traceback (most recent call last):
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
    put(task)
  File "/usr/lib64/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib64/python3.6/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function checker at 0x7f0c69ed38c8>: attribute lookup checker on __main__ failed
遇到错误:
无法pickle:main上的属性查找检查器失败
回溯(最近一次呼叫最后一次):
文件“/usr/lib64/python3.6/multiprocessing/pool.py”,第266行,在地图中
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中的文件“/usr/lib64/python3.6/multiprocessing/pool.py”,第644行
提升自我价值
文件“/usr/lib64/python3.6/multiprocessing/pool.py”,第424行,在“handle”任务中
放置(任务)
文件“/usr/lib64/python3.6/multiprocessing/connection.py”,第206行,在send中
self.\u发送\u字节(\u ForkingPickler.dumps(obj))
文件“/usr/lib64/python3.6/multiprocessing/reduce.py”,第51行,转储
cls(buf,协议).dump(obj)
_pickle.PicklingError:无法pickle:main上的属性查找检查器失败
我试着用几种方法重写函数,但我定义的任何函数,即使是最简单的函数,都会出现相同的错误。我尝试了提出的解决方案,但没有成功

提前感谢,我对AWS产品非常陌生