我正在尝试使用该Dedupe
包将一个小的杂乱数据合并到一个规范表中。由于规范表非常大(1.22 亿行),我无法将其全部加载到内存中。
我基于此使用的当前方法需要一整天的时间来处理测试数据:存储在 dict 中的 300k 行杂乱数据表和存储在 mysql 中的 600k 行规范数据表。如果我在内存中完成所有操作(将规范表作为字典读取)只需要半小时。
有没有办法让这更有效?
blocked_pairs = block_data(messy_data, canonical_db_cursor, gazetteer)
clustered_dupes = gazetteer.matchBlocks(blocked_pairs, 0)
def block_data(messy_data, c, gazetteer):
block_groups = itertools.groupby(gazetteer.blocker(messy_data.viewitems()),
lambda x: x[1])
for (record_id, block_keys) in block_groups:
a = [(record_id, messy_data[record_id], set())]
c.execute("""SELECT *
FROM canonical_table
WHERE record_id IN
(SELECT DISTINCT record_id
FROM blocking_map
WHERE block_key IN %s)""",
(tuple(block_key for block_key, _ in block_keys),))
b = [(row[self.key], row, set()) for row in c]
if b:
yield (a, b)