在python中检查字符串是否在2 GB的字符串列表中

在python中检查字符串是否在2 GB的字符串列表中,python,Python,我有一个2GB的大文件(a.txt),其中包含字符串列表['Question'、'Q1'、'Q2'、'Q3'、'Ans1'、'Format'、'links'、…] 现在我有了另一个较大的文件(1TB),在第二个位置包含上述字符串: 输出: a,问题,b 这个测验是 这是问题1的答案 这里是Ans1 国王1号,林克斯,国王2号 编程、语言、drupal、, ..... 我想保留第二个位置包含存储在文件A.txt中列表中字符串的行。也就是说,我想保留(存储在另一个文件中)下面提到的行: a,问题,

我有一个2GB的大文件(
a.txt
),其中包含字符串列表
['Question'、'Q1'、'Q2'、'Q3'、'Ans1'、'Format'、'links'、…]

现在我有了另一个较大的文件(1TB),在第二个位置包含上述字符串:

输出:

a,问题,b
这个测验是
这是问题1的答案
这里是Ans1
国王1号,林克斯,国王2号
编程、语言、drupal、,
.....
我想保留第二个位置包含存储在文件
A.txt
中列表中字符串的行。也就是说,我想保留(存储在另一个文件中)下面提到的行:

a,问题,b
这是问题1的答案
这里是Ans1
国王1号,林克斯,国王2号

我知道当文件(A.txt)中的列表长度为100时如何使用“any”。但当文件(A.txt)中的列表长度为2GB时,我不知道该如何处理它。

不要使用列表;用一套来代替

将第一个文件读入一个集合:

with open('A.txt') as file_a:
    words = {line.strip() for line in file_a}
0.5 GB的单词在一个集合中存储起来并不多

现在,您可以在O(1)恒定时间内对
单词进行测试:

if second_word in words:
    # ....
打开第二个文件并逐行处理,如果行和字是逗号分隔的,可以使用
csv
模块

对于较大的单词集,使用数据库代替;Python附带了
sqlite3
库:

import sqlite3

conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE words (word UNIQUE)')

with open('A.txt') as file_a, conn:
    cursor = conn.cursor()
    for line in file_a:
        cursor.execute('INSERT OR IGNORE INTO words VALUES (?)', (line.strip(),))
然后,对其进行测试:

cursor = conn.cursor()
for line in second_file:
    second_word = hand_waving
    cursor.execute('SELECT 1 from words where word=?', (second_word,))
    if cursor.fetchone():
         # ....

尽管我在这里使用了
:memory:
数据库,但SQLite足够智能,可以在开始填充内存时将数据存储在临时文件中。
:内存:
连接基本上只是一个临时的、一次性的数据库。如果要重复使用Word数据库,也可以使用真实的文件路径。

从答案开始。如果速度太慢,您可以使用a来减少使用数据库的次数,方法是删除可能与列表中的任何单词都不匹配的行。Python自带了一个内置函数,您可以将其中一个哈希值用于筛选表,并且可以查找任意数量的其他哈希值。

@JonClements:Fallback选项,sqlite。不是真的需要,但是查询可以重写为IN/ANY或EXISTS,或者如果你手头有redis或类似的服务器,那么它会工作得很好…@JonClements:I不认为
EXISTS
在这里会有帮助;然后我必须实际获取该值并测试该列。现在我只需要测试是否有任何返回(
.fetchone()
将返回
None
如果没有结果)。我刚才添加的
UNIQUE
约束和自动索引将在这里提供更多帮助。:-)