Ho appena avuto questo problema qualche giorno fa! Non sono sicuro se questo aiuta nel tuo caso specifico poiché non stai fornendo così tanti dettagli, ma la mia situazione era di lavorare offline su un set di dati "di grandi dimensioni". I dati sono stati ottenuti come file CSV con gzip da 20 GB da contatori di energia, dati di serie temporali a intervalli di diversi secondi.
File 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
Creare un iteratore di blocchi direttamente sul file gzip (non decomprimere!)
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,
)
Scorri i pezzi
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
All'interno del chunk loop, sto facendo un po 'di filtraggio e ricampionamento in tempo. In questo modo ho ridotto le dimensioni da 20 GB a poche centinaia di MB HDF5 per un'ulteriore esplorazione dei dati offline.