Tôi chỉ có vấn đề này một vài ngày trước! Không chắc điều này có giúp ích gì trong trường hợp cụ thể của bạn không vì bạn không cung cấp quá nhiều chi tiết, nhưng tình huống của tôi là làm việc ngoại tuyến trên bộ dữ liệu 'lớn'. Dữ liệu được lấy là các tệp CSV được nén 20GB từ các đồng hồ đo năng lượng, dữ liệu chuỗi thời gian trong khoảng thời gian vài giây.
Tệp IO:
data_root = r"/media/usr/USB STICK"
fname = r"meters001-050-timestamps.csv.gz"
this_file = os.path.join(data_root,fname)
assert os.path.exists(this_file), this_file
this_file
Tạo một trình vòng lặp chunk trực tiếp trên tệp gzip (không giải nén!)
cols_to_keep = [0,1,2,3,7]
column_names = ['METERID','TSTAMP','ENERGY','POWER_ALL','ENERGY_OUT',]
parse_dates = ['TSTAMP']
dtype={'METERID': np.int32,
'ENERGY': np.int32,
'POWER_ALL': np.int32,
'ENERGY_OUT': np.int32,
}
df_iterator = pd.read_csv(this_file,
skiprows=0,
compression='gzip',
chunksize=1000000,
usecols=cols_to_keep,
delimiter=";",
header=None,
names = column_names,
dtype=dtype,
parse_dates=parse_dates,
index_col=1,
)
Lặp đi lặp lại trên khối
new_df = pd.DataFrame()
count = 0
for df in df_iterator:
chunk_df_15min = df.resample('15T').first()
#chunk_df_30min = df.resample('30T').first()
#chunk_df_hourly = df.resample('H').first()
this_df = chunk_df_15min
this_df = this_df.pipe(lambda x: x[x.METERID == 1])
#print("chunk",i)
new_df = pd.concat([new_df,chunk_df_15min])
print("chunk",count, len(chunk_df_15min), 'rows added')
#print("chunk",i, len(temp_df),'rows added')
#break
count += 1
Trong vòng lặp chunk, tôi đang thực hiện một số bộ lọc và lấy mẫu lại đúng thời gian. Làm điều này tôi đã giảm kích thước từ 20 GB xuống vài trăm MB HDF5 để khám phá dữ liệu ngoại tuyến hơn nữa.