python - 哈希不可哈希
问题描述
设置
假设我们有一个由唯一代码(字符串)或唯一代码列表(更多关于后者)标识的xml 产品(lxml 元素)。产品开始标签位于第一个 xml 提要中的S1 字节索引(开始),产品结束标签位于E1 字节索引(结束)。然后,在第二个 xml 提要中有一个匹配的产品。提要具有相同的格式,但产品物理位置不同 - 第二个产品在第二个提要中具有位置S2和E2字节索引。
任务是将这两种匹配的产品放在一个地方(一次,同时)。此任务的一部分是获取两个提要(两组产品)的差异。目标是在处理大型 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!
然后,要找到通用代码,对键使用集合操作就足够了。
但是有一些问题:
在这种情况下,产品将同时被解析为普通和差异(一个子代码是新的,一个是普通的)
products_from_first_feed = { 'sub_a': [S1, E1], ... } products_from_second_feed = { 'sub_a': [S2, E2], 'sub_b': [S2, E2] ... }
信息重复 - 位置信息将乘以产品变体的数量(每个子代码实际上是一个产品变体)。
是否有可能找到更好的解决方案?我试图将产品表示为其位置和所有子代码的多维矩阵,但始终未能有效地从给定的单个子代码中检索所有子代码......
解决方法
第一个问题现在通过任何子代码上的重复过滤器来解决。
通过减少冗余信息量部分解决了第二个问题
解决方案
推荐阅读
- netsuite - SuiteScript 2 Bundle 公司偏好
- angular - App.html 中的菜单不适用于 firebase Ionic 3
- javascript - 必需的脚本可以停止其父脚本的执行吗?
- c++ - MS Visual C++:导出带有 `@` 的符号
- java - Java中的泛型和通配符
- c# - Serilog JSON 配置中的“使用”有什么作用?
- node.js - 在节点版本之间自动切换的最佳方法是什么?
- python - 异常值如何处理和替换
- react-native - 为什么我的图像没有在 React Native 中显示
- ios - 给定具有任何pointSize的UIFont,如何计算适当的笔划宽度?