我有以下代码片段,可以将CSV读入数据帧,并以符合Redis协议的方式将键值对写入文件,即
CSV大约有600万行,读入数据框非常快(少于2分钟)。输出文件有1200万行(每个输入文件的行数为2)。这需要约50分钟才能完成。我的代码中是否有任何部分可以优化/更改,以使其运行更快?一旦文件完成,将其加载到Redis只需不到90秒。瓶颈确实在于写文件上。我将有几个这样的文件要写,每个文件耗费50-60分钟真的不理想。这个特定的数据集有600万行和10列,主要由字符串组成,有一些浮点列。Redis键是字符串,浮点值是键值对中的Redis值。其他数据集的大小都类似,甚至更大(与行和列有关)。
我正在研究如何将我生成的所有字符串加载到数据帧中,然后使用to_csv()函数将其转储到文件中,但我不确定其性能如何。
SET key1 value1
。这个代码是零散的,我试图使用多进程,但不确定它的性能(收益)。CSV大约有600万行,读入数据框非常快(少于2分钟)。输出文件有1200万行(每个输入文件的行数为2)。这需要约50分钟才能完成。我的代码中是否有任何部分可以优化/更改,以使其运行更快?一旦文件完成,将其加载到Redis只需不到90秒。瓶颈确实在于写文件上。我将有几个这样的文件要写,每个文件耗费50-60分钟真的不理想。这个特定的数据集有600万行和10列,主要由字符串组成,有一些浮点列。Redis键是字符串,浮点值是键值对中的Redis值。其他数据集的大小都类似,甚至更大(与行和列有关)。
我正在研究如何将我生成的所有字符串加载到数据帧中,然后使用to_csv()函数将其转储到文件中,但我不确定其性能如何。
filepath = '/path/to/file.csv'
def df_to_file:
df = pd.read_csv(filepath)
f = open('output_file', 'w')
for i in range(len(df.index)):
if df['col1'].iloc[i] != '':
key1 = str(df['col1'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1 = df['col_n+1'].iloc[i]
key1a = str(df['col1'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1a = df['col_n+2'].iloc[i]
print('SET {0} {1}\nSET {0} {1}'.format(key1, val1, key1a, val1a), file = f)
if df['col2'].iloc[i] != '':
key1 = str(df['col2'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1 = df['col_n+1'].iloc[i]
key1a = str(df['col2'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1a = df['col_n+2'].iloc[i]
print('SET {0} {1}\nSET {0} {1}'.format(key1, val1, key1a, val1a), file = f)
if df['col3'].iloc[i] != '':
key1 = str(df['col3'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1 = df['col_n+1'].iloc[i]
key1a = str(df['col3'].iloc[i])+str(df['col4'].iloc[i])+str(df['col5'].iloc[i])+...+str(df['col_n'].iloc[i])
val1a = df['col_n+2'].iloc[i]
print('SET {0} {1}\nSET {0} {1}'.format(key1, val1, key1a, val1a), file = f)
f.close()
p = Process(target = df_to_file)
p.start()
p.join()
iloc[i]
来提取单行数据,这将会极大地降低性能。除非您提供一个小的代表性输出数据框的示例,否则很难再做更多说明。 - juanpa.arrivillagadf
看起来像什么? - juanpa.arrivillagakey1
和val1
吗? - relaykey1, val1 = string1, string2
是从哪里来的?请提供一个 [mcve]。 - juanpa.arrivillaga