我的工作每天从流媒体作业中收集多次,并将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)
附加说明: 这是使用Azure Machine Learning Workbench作为我的train.py流程的一部分完成的。
- 编辑 -
Data Science VM和存储帐户均位于SC US。 DSVM是DS4_V2标准(8c cpu,28gb内存)。 我目前的测试中所有blob的总大小可能接近200MB。
我对副本进行了定时,并且很快就会出现一些示例输出,其中时间打印与顶部的代码对齐。第一个文件需要13秒才能下载,0.01需要追加。秒需要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容器中。我不确定它在存储/ premium / ssd方面的位置。 VM本身有56gb&#34;本地ssd&#34;作为ds4_v2的配置。
##### BEGIN TRAINING PIPELINE
# Create the outputs folder - save any outputs you want managed by AzureML here
os.makedirs('./outputs', exist_ok=True)
我没有尝试过并行路线,需要一些指导如何解决这个问题。