【发布时间】:2022-05-07 06:25:26
【问题描述】:
我的本地目录中有 10000 个 10Mb 文件,我正在尝试使用 boto3 通过顺序上传方法将其上传到 Amazon S3 中的存储桶。我在这里面临的唯一问题是将大量文件上传到 S3 需要大量时间。我想知道是否有有效的方法(使用多线程或多处理)将文件上传到 Amazon S3?
root_path ="/home/shivraj/folder/"
path = root_path+'folder_raw/' # use your path
dest_path = root_path+'folder_parsed/'
backup_path = root_path+'folder_backup/'
def parse_ivn_files():
src_files_list = glob.glob(path + "*.txt.zip") # .log files in the path files
try:
if src_files_list:
for file_ in src_files_list:
df = pd.read_csv(file_,compression="zip",sep="|", header=None)
file = file_.replace(path,'')
file_name = file.replace(".txt.zip",'')
df.columns=["Date","Time","System_Event","Event_Type","Event_sub_type","Latitude","Longitude","Field_1","Field_2","Field_3","Field_4","Event_Number","Event_Description"]
new_df=df['Event_Description'].str.split(',',expand=True)
large_df = pd.concat([df,new_df],axis=1)
large_df.to_csv(dest_path+file_name+".csv",index=False)
s3.meta.client.upload_file(dest_path+file_name+".csv", 's3-bucket-name-here', 'ivn_parsed/'+file_name+".csv")
s3.meta.client.upload_file(path+file_name+".txt.zip", 's3-bucket-name-here', 'ivn_raw_backup/'+file_name+"_bk.txt.zip")
os.rename(path+file_name+".txt.zip", backup_path+file_name+"_bk.txt.zip")
else:
print("No files in the source folder")
except:
raise FileNotFoundError
【问题讨论】:
-
Amazon Snowball 是您或许应该考虑的左侧字段选项。
-
您可能需要使用多个线程并行运行您的代码。我的猜测是,在某些时候,您将在 CPU 利用率(在 gzip 解压缩中)、磁盘 I/O(从本地存储中读取字节)或网络 I/O(将字节推送到 S3)方面成为瓶颈。你被困在哪一个决定了你需要继续前进。但是要卡在其中任何一个上,您需要开始并行处理多个文件。
-
非常感谢您的意见。我会调查他们。
-
在走多线程的道路之前,您需要分析您当前的吞吐量和可用带宽。如果你有一个千兆连接到互联网,那么是的,你可以通过分离读取、压缩和写入过程来提高性能。但是,如果您与一群人共享 25 兆位(或更慢)的连接,您可能会遇到带宽限制。
-
@kdgregory 带宽延迟产品对 TCP 的影响表明并行化几乎总是有一些好处。
标签: python amazon-web-services amazon-s3 boto3