如何提高S3 Jupyter Notebook (SageMaker Studio)中XML检索和解析的速度?<



我正在为计算机视觉项目管理数据,我正在寻找一种快速的方法来搜索和操作给定目录中的所有文件。我有一个工作的解决方案,但我只能处理也许10-20个文件每秒。我是Jupyter notebook的新手,所以我正在寻找有关提高所附代码效率的建议。

当前代码如下:

car_count=0
label_dict={}
purge_list=[]
for each_src in source_keys:
pages = paginator.paginate(Bucket=src_bucket, Prefix=each_src)
for page in pages:
for obj in page['Contents']:
fpath = obj['Key']
fname = fpath.split('/')[-1]
if fname == '':
continue
copy_source = {
'Bucket': src_bucket,
'Key': fpath
}
if fname.endswith('.xml'):
obj=s3.Object(src_bucket,fpath)
data=obj.get()['Body'].read()
root = ET.fromstring(data)
for box in root.findall('object'):
name=box.find('name').text
if name in label_dict:
label_dict[name] +=1
else :
label_dict[name] = 1
if name not in allowed_labels:
purge_list.append(fpath)
print(f'Labels: {label_dict}',end='r')
print(f'nTotal Images files:{i}, Total XML files:{j}',end='r')
#print(f'nLabels: {label_dict})
print(f'nPURGE LIST: ({len(purge_list)} files)')
<标题>

可能的解决方式:多线程-我已经在正常的Python 3中做了线程。在笔记本中使用多线程是常见的吗?读取文件-目前读取整个文件,不确定这是否是一个大的停滞点,但可能会提高速度。

Jupyter通常有很多开销—您的语法有三层for循环。在python世界中,for循环越少越好——同样,binary数据几乎总是更快。所以,一些建议:

  • 重新构建for循环,使用pypi中的一些专门的库用于文件fs
  • 改变语言吗?使用bash脚本
  • 多线程确实是一种方式
  • 缓存,使用redis或其他快速数据结构来"读取";数据
  • golang相对来说更容易从python跳转,也有很好的多线程支持-我的2分:至少值得一试

最新更新