我的问题是这个。我有一个文件有3000行和8列(空格分隔)。重要的是第一列是1到22之间的数字。因此,在“分而治之”原则中,我根据第一列值将原始文件拆分为22个子文件。
我有一些结果文件。其中15个源包含1个结果文件。但是结果文件太大了,所以我再次应用了“分而治之”来将15个结果中的每一个分成22个子文件。
文件结构如下:
Original_file Studies
split_1 study1
split_1, split_2, ...
split_2 study2
split_1, split_2, ...
split_3 ...
... study15
split_1, split_2, ...
split_22
因此,通过这样做,我们在开始时支付了一点点开销,但所有这些拆分文件将在最后删除。所以它并不重要。
我需要将我的最终输出作为原始文件,其中包含附加研究的一些值。
所以,到目前为止我的观点是:
Algorithm:
for i in range(1,22):
for j in range(1,15)
compare (split_i of original file) with the jth studys split_i
if one value on a specific column matches:
create a list with needed columns from both files, split row with ' '.join(list) and write the result in outfile.
有没有更好的方法来解决这个问题?因为研究文件的大小从300MB到1.5GB不等。
到目前为止,这是我的Python代码:folders = ['study1', 'study2', ..., 'study15']
with open("Effects_final.txt", "w") as outfile:
for i in range(1, 23):
chr = i
small_file = "split_"+str(chr)+".txt"
with open(small_file, 'r') as sf:
for sline in sf: #small_files
sf_parts = sline.split(' ')
for f in folders:
file_to_compare_with = f + "split_" + str(chr) + ".txt"
with open(file_to_compare_with, 'r') as cf: #comparison files
for cline in cf:
cf_parts = cline.split(' ')
if cf_parts[0] == sf_parts[1]:
to_write = ' '.join(cf_parts+sf_parts)
outfile.write(to_write)
但是这段代码使用4个循环,这是一种过度杀伤,但是你必须这样做,因为你需要同时读取被比较的2个文件中的行。这是我关心的问题......
答案 0 :(得分:1)
我发现一个解决方案似乎在很长一段时间内都有效。代码如下:
with open("output_file", 'w') as outfile:
for i in range(1,23):
dict1 = {} # use a dictionary to map values from the inital file
with open("split_i", 'r') as split:
next(split) #skip the header
line_list = line.split(delimiter)
for line in split:
dict1[line_list[whatever_key_u_use_as_id]] = line_list
compare_dict = {}
for f in folders:
with open("each folder", 'r') as comp:
next(comp) #skip the header
for cline in comp:
cparts = cline.split('delimiter')
compare_dict[cparts[whatever_key_u_use_as_id]] = cparts
for key in dict1:
if key in compare_dict:
outfile.write("write your data")
outfile.close()
通过这种方法,我能够在~10分钟内计算出这个数据集。当然,还有改进的方法。一个想法是花时间对数据集进行排序,以便稍后搜索会更快,我们可以节省时间!