Acabei de ter esse problema há alguns dias! Não tenho certeza se isso ajuda no seu caso específico, pois você não está fornecendo tantos detalhes, mas minha situação era trabalhar offline em um conjunto de dados 'grande'. Os dados foram obtidos como arquivos CSV compactados em gb de 20 GB a partir de medidores de energia, dados de séries temporais em intervalos de alguns segundos.
Arquivo E / S:
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
Crie um iterador de bloco diretamente sobre o arquivo gzip (não descompacte!)
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,
)
Iterar sobre os pedaços
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
Dentro do loop do bloco, estou fazendo algumas filtragem e re-amostragem no prazo. Com isso, reduzi o tamanho de 20 GB para algumas centenas de MB HDF5 para mais exploração de dados offline.