Python 搁置从溢出页中提升

Python 搁置从溢出页中提升,python,xml,python-2.7,lxml,shelve,Python,Xml,Python 2.7,Lxml,Shelve,我从XML文件中读取了很多数据,但以后只有一部分数据会保存在数据库中 XML的结构如下所示: <element id="1" other_attrib=""> <element id="2" other_attrib=""> ... <other_element> <elem id="1"> <elem id="100"> </other_element> <other_element> <el

我从XML文件中读取了很多数据,但以后只有一部分数据会保存在数据库中

XML的结构如下所示:

<element id="1" other_attrib="">
<element id="2" other_attrib="">
...
<other_element>
  <elem id="1">
  <elem id="100">
</other_element>
<other_element>
  <elem id...>
</other_element>
基本上我所做的是为每个元素
iterparse
返回:

if elem.tag == 'element':
  shlv[elem['id']] = {'attrib1': elem['other_attrib'], 'attrib2': elem['attrib2']}
elif elem.tag == 'other_element':
  # Here I iterate through this tags children and find references in shlv object
  for ref in elem:
    save_in_database(shlv[ref.attrib['id']])

我可以更改什么以使
搁置
处理更多数据?或者我应该使用其他东西来存储这些数据?

如何将您的ID存储在搁置中?你能给我们一些代码吗?@Squall我已经更新了这个问题,因为shelve就像一本字典,我认为它正在遭受多重哈希冲突:不同的id(类型为
str
,如果你只使用
e.attrib['id']
)共享相同的
hash()
值。您可以尝试在XML上迭代两次:首先,读取
其他元素的ID并将其保存在
集合()
中(这会降低内存使用率,因为您不存储整个元素)。之后,您只需获得感兴趣的
元素。您还可以尝试使用普通的
dict()
代替shelve,并可能将id转换为
int
(不能用作shelve的键)。祝你好运这个XML是第三方的,我不能重新构造它…当然可以使用XSLT,python的lxml可以运行XSLT。展示你理想的重组。我们甚至可以将源文档拆分为两个XML@Parfait我不知道OP的XML文件的大小,但是lxml只支持XSLT1.0,您必须将整个XML文档读入内存。如果文件不适合RAM,则需要支持流式转换的XSLT(3.0)处理器。
if elem.tag == 'element':
  shlv[elem['id']] = {'attrib1': elem['other_attrib'], 'attrib2': elem['attrib2']}
elif elem.tag == 'other_element':
  # Here I iterate through this tags children and find references in shlv object
  for ref in elem:
    save_in_database(shlv[ref.attrib['id']])