【发布时间】:2016-06-20 21:07:13
【问题描述】:
我有两个文件:
- file1(2 亿行)格式:email:hash1:hash2
- file2(9000 万行)格式:hash:plaintext
我想要做的是将 file1 中的 hash(1 或 2) 替换为 file2 中的纯文本。我尝试使用我之前在此处two lists, faster comparison in python 提出的问题的解决方案(实际代码粘贴在下面),但不幸的是,对于如此大的数据集,它并没有那么快。它适用于较小的文件(少量行),但不适用于较大的文件。
您对“更快”处理这两个文件有何建议?
编辑:上面提到的源代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
def banner():
print('\n%s v 1.0\nby d2@tdhack.com\n' % sys.argv[0])
def getlength(fname):
return sum(1 for line in open(fname))
def ifexist(fname):
if not os.path.isfile(fname):
banner()
print('[-] %s must exist' % fname)
sys.exit(1)
def replace(l, X, Y):
for i,v in enumerate(l):
if v == X:
l.pop(i)
l.insert(i, Y)
if len(sys.argv) < 2:
banner()
print('[-] please provide CRACKED and HASHES files')
sys.exit(1)
CRACKED=sys.argv[1]
HASHES=sys.argv[2]
ifexist(CRACKED)
ifexist(HASHES)
banner()
print('[i] preparing lists from "%s" [%d lines] and "%s" [%d lines]' %(CRACKED, getlength(CRACKED), HASHES, getlength(HASHES)))
with open(CRACKED) as crackedfile:
cracked = dict(map(str, line.split(':', 1)) for line in crackedfile if ':' in line)
hashdata = [line.rstrip('\n') for line in open(HASHES)]
print('[i] pairing items, this will take a while so please be patient')
for item in hashdata:
if item in cracked:
replace(hashdata, item, item+':'+cracked[item].strip('\n'))
print('[i] writting changes')
fout = open(HASHES+'_paired', 'w')
for item in hashdata:
fout.write(item+'\n')
fout.close()
print('[+] done, now check "%s" [%d lines] file for results.' % (HASHES+'_paired', getlength(HASHES+'_paired')))
【问题讨论】:
-
最好以最小的形式在此处发布您的代码(而不是 pastebin)以避免被否决并帮助那些将提供答案的人。
-
tbh,我认为没有任何方法可以提高效率。如果内存管理是问题,您可以将其拆分为几个较小的文件,但就效率而言,您无法真正提高效率。即使是可以处理大量数据的 SQL 数据库也会变慢。
-
在迭代时写入文件,会阻止某些部分保留在内存中。
-
好吧,我试着把它分成 100 万行然后处理,但即使算法很慢。我想知道“替换”功能是否可能是这里的问题?老实说,当我查看将修改后的数据打印到屏幕上的所谓调试会话时,它们之间几乎有 1 秒的延迟。内存在这里不是问题。我认为它实际上会加快速度,但我也意识到整个操作是单线程的(我在处理这些文件时观看了“顶部”输出)
-
@zerocool 我想了一个办法。检查我的答案。
标签: python