我有大量的csv数据,大约40GB的大小需要处理(让我们称之为'body')。本体中每个文件中的数据由单列CSV文件组成。每行是由单词和短句组成的关键字,例如,使用熊猫或其他方法比较大型文本数据(〜40GB)
Dog
Feeding cat
used cars in Brighton
trips to London
.....
该数据需要与另一组文件(这个7GB的大小,我将称之为“减除”),从减除任何关键字需要确定并排出体外进行比较。为清除量数据类似于什么在身上,即:
Guns
pricless ming vases
trips to London
pasta recipes
........
虽然我有一个方法,将完成这项工作,这是一个非常缓慢的办法,可能需要一个美好的一周结束。这是一种多线程方法,其中来自7GB主体的每个文件在for循环中与来自主体的文件进行比较。它将Removals文件中的列转换为列表,然后过滤主体文件以保留任何不在该列表中的行。过滤后的数据添加到输出文件:
def thread_worker(file_):
removal_path="removal_files"
allFiles_removals = glob.glob(removal_path + "/*.csv", recursive=True)
print(allFiles_removals)
print(file_)
file_df = pd.read_csv(file_)
file_df.columns = ['Keyword']
for removal_file_ in allFiles_removals:
print(removal_file_)
vertical_df = pd.read_csv(vertical_file_, header=None)
vertical_df.columns = ['Keyword']
vertical_keyword_list = vertical_df['Keyword'].values.tolist()
file_df = file_df[~file_df['Keyword'].isin(vertical_keyword_list)]
file_df.to_csv('output.csv',index=False, header=False, mode='a')
很显然,我的主要目的是解决如何完成这件事faster.Is熊猫即使是最好做到这一点呢?在处理CSV文件时,我倾向于默认使用它。
你想比较什么?一个文件中的所有数据都针对另一个文件中的所有数据 – Jimilian
准确地说,我想要拍摄一组文件(总计40GB),并且我想删除也出现在另一组文件(7GB主体)中的任何关键字。 – GreenGodot
我会把身体分成几块,比如说每个1GB,也许根据你的RAM大小,在每个块上并行地完成其余部分。然后转换一个块(使用'awk'),使其每行有一个单词并引入一个NUL和另一个独特的字符来标记行的开始和结束。然后针对该块运行删除的'grep -vfb'。然后重新组装。 –