ddict = defaultdict(set)
file_str = query_csv_s3(s3, BUCKET_NAME, filename, sql_exp, use_header)
# read CSV to dataframe
df = pd.read_csv(StringIO(file_str))
fdf = df.drop_duplicates(subset='cleverTapId', keep='first')
fdf.dropna(inplace=True)
col_one_list = fdf['identity'].tolist()
col_two_list = fdf['cleverTapId'].tolist()
for k, v in zip(col_one_list, col_two_list):
ddict[k].add(v)
for imkey in ddict:
im_length = len(str(imkey))
if im_length == 9:
if len(ddict[imkey]) == 1:
for value in ddict[imkey]:
tdict = {imkey:value}
write_to_csv(FILE_NAME,tdict)
else:
ctlist = list(ddict[imkey])
snp_dict = {imkey:'|'.join(ctlist)}
write_to_csv(SNAP_FILE_NAME, snp_dict)
elif im_length > 0:
if len(ddict[imkey]) == 1:
for value in ddict[imkey]:
fdict = {imkey:value}
write_to_csv(FRAUD_FILE_NAME,fdict)
else:
pass
# mult_ct = list(ddict[imkey])
# mydict = {imkey:','.join(mult_ct)}
# write_to_csv(MY_FILENAME,mydict)
else:
pass
여기 있습니다 write_to_csv
:
def write_to_csv(filename,mdict):
file_exists = os.path.isfile(filename)
with open(filename,'a',newline='') as csvfile:
headers = ['IM No', 'CT ID']
writer = csv.DictWriter(
csvfile,
delimiter=',',
lineterminator='\n',
fieldnames=headers
)
if not file_exists:
writer.writeheader()
for key in mdict:
writer.writerow({'IM No': key, 'CT ID': mdict[key]})
s3 select를 사용하여 2 col을 포함하는 csv 파일을 읽고 있습니다.
1 IM : 1 CTID, 일대 다 및 다 대다 파일을 생성하고 s3 버킷에 다시 업로드하고 있습니다.
s3에서 읽은 530MB 파일 크기를 처리하고 다시 업로드하는 데 18 시간이 걸리기 때문에 어떻게 더 최적화 할 수 있습니까?
코드를 실행할 수 없기 때문에 이것은 본질적으로 추측입니다. CSV 파일에 데이터를 쓰는 방식은 매우 비효율적입니다.
SSD 또는 디스크에 대한 I / O 작업은 IT에서 비용이 더 많이 드는 작업 중 하나입니다. 지금 추가하려는 각 줄에 대해 파일을 연 다음 추가하고 파일을 다시 닫습니다. 즉, 530MB 파일의 경우 이러한 값 비싼 작업을 수백만 번 수행 할 것입니다.
작업 관리자의 성능 탭을 확인하면 디스크 사용량이 매우 높을 것입니다.
이들 중 일부 (또는 RAM이 충분히 큰 경우 모두)를 메모리에 버퍼링하고 마지막에 디스크에 플러시하는 것이 훨씬 더 효율적입니다.
대략 다음과 같습니다.
FRAUD_FILE_CONTENTS = []
# Computation stuff
FRAU_FILE_CONTENTS.append({"my": "dict"})
# After the loop
with open(FRAUD_FILE_NAME, "w"):
# Write to CSV
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다