1

我的工作每天从流式工作中收集多次,并将 csv 放入 blob 存储中。在收集数据几周后,我将运行一个 python 脚本来做一些机器学习。为了设置训练数据,我首先将一个范围内的所有数据移动到虚拟机上的单个 csv 中,以便它可以一次在该单个 csv 上进行训练。

使用下面的代码,我发现使用 blob_service.get_blob_to_path() 将数据从 blob 存储移动到虚拟机平均每个文件需要 25 秒,即使它们是 3mb 的小文件。附加部分的速度非常快,每个文件只需几毫秒。

有一个更好的方法吗?我认为增加最大连接数会有所帮助,但我没有看到任何性能改进。

blob_service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)

# get list of blob files?
blobs = []
marker = None
while True:
    batch = blob_service.list_blobs(CONTAINER_NAME, marker=marker)
    blobs.extend(batch)
    if not batch.next_marker:
        break
marker = batch.next_marker

for blob in blobs:
    print(time.time()-start_time)
    split_name = blob.name.split('/')
    # year/month/day...
    blob_date = pd.to_datetime(str(split_name[0])+'-'+str(split_name[1])+'-'+str(split_name[2]))
    # s=arg start date, e=arg end date
    if blob_date > s and blob_date <= e:
        print('Appending: '+ blob.name, end='')
        blob_service.get_blob_to_path(CONTAINER_NAME,blob.name,
                                        './outputs/last_blob.csv',
                                        open_mode='wb',
                                        max_connections=6)
        print(' ... adding to training csv ' +str(time.time()-start_time))
        with open('./outputs/all_training_data.csv','ab') as f_out:
            with open('./outputs/last_blob.csv','rb') as blob_in:
                for line in blob_in:
                    f_out.write(line)

    else:
        print('** SKIPPING: '+ blob.name)

附加说明:这是在我的 train.py 过程中使用 Azure 机器学习工作台完成的。

- 编辑 -

Data Science VM 和 Storage Account 都在 SC US。DSVM 是 DS4_V2 标准(8c cpu,28gb 内存)。我当前测试的所有 blob 的总大小可能接近 200MB。

我对副本进行了计时,它很快就会出现一些示例输出,其中时间打印与顶部的代码对齐。第一个文件下载需要 13 秒,追加需要 0.01 秒。Second 需要 6 秒,然后追加 0.013。第三次下载需要 24 秒。

1666.6139023303986
Appending: 2017/10/13/00/b1.csv ... adding to training csv 1679.0256536006927
1679.03680062294
Appending: 2017/10/13/01/b2.csv ... adding to training csv 1685.968115568161
1685.9810137748718
Appending: 2017/10/13/02/b3.csv ... adding to training csv 1709.5959916114807

这一切都发生在 vm 中抛出的 docker 容器中。我不确定它在存储/高级/固态硬盘方面的位置。VM 本身具有 56gb“本地 ssd”作为 ds4_v2 的配置。

##### BEGIN TRAINING PIPELINE
# Create the outputs folder - save any outputs you want managed by AzureML here
os.makedirs('./outputs', exist_ok=True)

我没有尝试过平行路线,需要一些关于如何解决这个问题的指导。

4

0 回答 0