Dask合并操作失败,原因是内存错误,我尝试合并两个csv文件,第一个文件大小为6.5 GB,带有48个属性列,第二个文件为315 MB,带有三个属性列,我们进行了此操作在具有8 GB RAM和2个vCPU的服务器(Amazon EC2 t2.large linux redhat)上,在取消作业后,内存开始增加,直到OS终止该作业。之后,我将以下两个键添加到sysctl.conf
中,新错误变为“ Memoey错误”和“内存不足”。
vm.overcommit_memory = 2 vm.overcommit_ratio = 90
代码快照:
result_df =pd.merge(first_df, second_df, left_index=True , right_index=True)
result_df.to_csv('result*.csv', sep=';')
您是否想念这里的任何东西?如果这是资源问题?还是迟钝的实现?以及对可以使用带有内存的一面磁盘的速度是否有限制。以及我可以进行哪种优化以获得更好的结果。
以下是使用索引和不使用索引的完整代码,但是结果相同,但是请注意,我使用的是单机而不是集群,我的理解是,如果内存不存在,则应该将其写入磁盘足够。
import dask.dataframe as pd
def build_data_file():
first_df = pd.read_csv('/home/lion/du/data/first_df', sep=';', blocksize=10000000,dtype={'user_ID': str}, names=['user_ID', 'att1', 'att2', 'att3','att4','att5','att6','att7','att8','att9','att10','att11','att12','att13','att14', 'att15', 'att16', 'att17', 'att18','att19', 'att20', 'att21','att22','att23', 'att24','att25', 'att26', 'att27','att28', 'att29', 'att30', 'att31','att32', 'att33','att34', 'att35','att36', 'att37','att38','att39', 'att40','att41', 'att42', 'att43','att44','att45','att46', 'att47','att48','att49'])
second_df = pd.read_csv('/home/lion/du/data/second_df', sep=';', blocksize=10000000,dtype={'user_ID': str}, names=['user_ID', 'att_S_1', 'att_S_2', 'att_S_3'])
df_final = pd.merge(first_df, second_df, on='user_ID')
df_final.to_csv('result*.csv', sep=';')
if name == 'main': build_data_file()
****带有索引
import dask.dataframe as pd
def build_data_file():
first_df = pd.read_csv('/home/lion/du/data/first_df', sep=';', blocksize=10000000,dtype={'user_ID': str},
names=['user_ID', 'att1', 'att2',
'att3','att4','att5','att6','att7','att8','att9','att10','att11','att12','att13','att14', 'att15',
'att16', 'att17', 'att18','att19', 'att20', 'att21','att22','att23', 'att24','att25', 'att26', 'att27','att28', 'att29',
'att30', 'att31','att32', 'att33','att34', 'att35','att36', 'att37','att38','att39', 'att40','att41', 'att42',
'att43','att44','att45','att46', 'att47','att48','att49']).set_index('user_ID')
second_df = pd.read_csv('/home/lion/du/data/second_df', sep=';', blocksize=10000000,dtype={'user_ID': str},
names=['user_ID', 'att_S_1',
'att_S_2', 'att_S_3']).set_index('user_ID')
df_final =pd.merge(first_df, second_df, left_index=True , right_index=True)
df_final.to_csv('result*.csv', sep=';')
if __name__ == '__main__':
build_data_file()