有没有一种方法可以使用python加速csv从Azure Blob存储移动到vm,附加到单个csv

2024-04-23 06:38:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我的作业每天从流式作业收集多次,并将csv放入blob存储中。在收集了几个星期的数据之后,我将运行一个python脚本来进行一些机器学习。为了设置训练数据,我首先将一个范围内的所有数据移动到虚拟机上的一个csv中,这样它就可以在一次过程中在该csv上进行训练。你知道吗

使用下面的代码,我发现使用blob将数据从blob存储移动到虚拟机_服务。获取\u blob \u到\u路径()每个文件平均需要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机器学习工作台作为我的一部分来完成的训练.py过程。你知道吗

--编辑--

Data Science虚拟机和存储帐户都在SC US中。 DSVM是DS4\U 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

这一切都发生在虚拟机中抛出的docker容器中。我不确定它在存储/premium/ssd方面的位置。VM本身有56gb的“本地ssd”作为ds4\U v2的配置。你知道吗

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

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


Tags: 文件csvto数据nameindatetime