我有一个奇怪的问题。根据这样的帖子,我希望 IDLE 比在命令行上运行我的代码要慢。然而,我看到的完全相反。
该程序比较两个文件并将匹配的行配对在一起,并将所有匹配项写入一个新文件。我认为它类似于 SQL 中的连接。但我需要忽略没有匹配的行。以下是该程序所做的概述:
- 该程序读取一个~1kb的大文件并将每一行的键值对存储到字典中
- 然后它开始读取另一个~1kb 的大文件。对于每一行,它都会测试字典中的键是否存在于新文件中。如果是这样,它将对写入一个新文件。
似乎程序在尝试访问非常大的字典时卡住了。在 IDLE 中运行大约需要 2-3 分钟,但 1 小时后程序仍未在命令行上完成。当我访问 write_file 时,它的写入速度非常缓慢。
这是第一个文件的一些简化数据,其中数据由制表符分隔,数字是键,值是信息:
20\tinfo_first_file_20\n
18\tinfo_first_file_18\n
这是第二个文件的示例:
20\tinfo_second_file_20\n
30\tinfo_second_file_20\n
这是正在写入的文件的示例:
20\tinfo_first_file_20\t20\tinfo_second_file_20\n
功能
def pairer(file_1, file_2, write_file):
wf = open(write_file, 'w')
f1 = open(file_1, 'r')
line = f1.readline()
d = {}
while line != "":
key, value = line.strip('\n').split('\t')
d[key] = value
line = f1.readline()
f2 = open(file_2, 'r')
line_2 = f2.readline()
while line_2 != "":
key, value = line_2.strip('\n').split('\t')
if key in d.keys():
to_write = key +'\t' + d[key] + '\t' + key +'\t'+ value + '\n'
wf.write(to_write)
line_2 = f2.readline()
我如何在 IDLE 中运行代码
if __name__=="__main__":
pairer('file/location/of/file_1', 'file/location/of/file_2', 'file/location/of/write_file')
我如何在终端中运行代码
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('file_1', action="store")
parser.add_argument('file_2', action="store")
parser.add_argument('write_file', action="store")
results = parser.parse_args()
pairer(results.file_1, results.file_2, results.write_file)
所有代码都是对实际代码的简化。我希望我包含的内容足以让某人指出我正确的方向,但不要太多,所以我保持重点。我是编程新手,所以这可能是一个明显的问题,但我找不到任何东西。
使用终端时字典的最大大小是多少?它的存储方式是否不同,最终会耗尽我的记忆?
我有一个 Mac OSX 10.8。Tkinter 已更新。我正在使用python2.7。提前致谢。
编辑:
在程序达到这一点之前,它确实有大约 30 分钟的其他分析要做。但它只在这里失败。不确定这是否相关。另一部分只是将每个约 30kb 的大文件分成 22 个较小的文件。这里不涉及字典,速度也差不多。所以我可以处理较小级别的数据。
编辑2:
使用终端时内存清除方式是否不同?
我还注意到另一件事:当我查看 Activity Monitor 应用程序时,当我在 IDLE 中运行代码时,它似乎使用了更多的 CPU。我看起来它正在使用多个处理器,但这没有意义。因为我的代码不是为了并行运行而编写的。此外,当我在 IDLE 中运行计算机时,它会发出更多噪音。不是很定量,而是一种观察。