首页 > 解决方案 > 哈希不可哈希

问题描述

设置

假设我们有一个由唯一代码(字符串)或唯一代码列表(更多关于后者)标识的xml 产品lxml 元素)。产品开始标签位于第一个 xml 提要中的S1 字节索引(开始),产品结束标签位于E1 字节索引(结束)。然后,在第二个 xml 提要中有一个匹配的产品。提要具有相同的格式,但产品物理位置不同 - 第二个产品在第二个提要中具有位置S2E2字节索引。

任务是将这两种匹配的产品放在一个地方(一次,同时)。此任务的一部分是获取两个提要(两组产品)的差异。目标是在处理大型 xml 提要时找到对 RAM 最友好的解决方案(每个产品最多 20 000 个,大约 200MB,可能会有很大差异)。一次性 RAM 为 2-3Gb。

为了实现目标,使用 SAX 解析器并将产品替换为它在提要中的位置,在大多数没有问题的情况下,我们得到:

products_from_first_feed = { 'code': [S1, E1], ... }
products_from_second_feed = { 'code': [S2, E2], ... }

# 'code' == 'code' so [S1, E1] match [S2, E2], the products are common, great!  

问题

当产品由唯一代码列表描述时,问题就开始了,就像这样:

products_from_first_feed = { ['sub_a', 'sub_b']: [S1, E1], ... }
products_from_second_feed = { ['sub_a', 'sub_b']: [S2, E2], ... }

# ['sub_a', 'sub_b'] == ['sub_a', 'sub_b'] so [S1, E1] match [S2, E2], the products are common, great...?

这显然是不可能的。为了解决这种情况,代码被分解,每个子代码都与它的原始产品的位置相关联。

products_from_first_feed = { 'sub_a': [S1, E1], 'sub_b': [S1, E1], ... }
products_from_second_feed = { 'sub_a': [S2, E2], 'sub_b': [S2, E2] ... }

# 'sub_a' == 'sub_a' or 'sub_b' == 'sub_b' so [S1, E1] match [S2, E2], great! 

然后,要找到通用代码,对键使用集合操作就足够了。

但是有一些问题

  1. 在这种情况下,产品将同时被解析为普通和差异(一个子代码是新的,一个是普通的

     products_from_first_feed = { 'sub_a': [S1, E1],  ... }
     products_from_second_feed = { 'sub_a': [S2, E2], 'sub_b': [S2, E2] ... }
    
  2. 信息重复 - 位置信息将乘以产品变体的数量(每个子代码实际上是一个产品变体)。

是否有可能找到更好的解决方案?我试图将产品表示为其位置和所有子代码的多维矩阵,但始终未能有效地从给定的单个子代码中检索所有子代码......

解决方法

第一个问题现在通过任何子代码上的重复过滤器来解决。

通过减少冗余信息量部分解决了第二个问题

标签: pythonxmllxmlsax

解决方案


推荐阅读