【问题标题】:XML::Parser dies on big fileXML::Parser 死于大文件
【发布时间】:2014-04-02 14:57:56
【问题描述】:

我正在使用 Perl 脚本从 OSM 文件中提取 POLY:https://github.com/sev-/osm/blob/master/getbound.pl

最近遇到一个大文件(约60M)的问题:

curl -XPOST "http://overpass-api.de/api/interpreter" -d"data=[timeout:900];(node(56.59,60.0,56.99,60.96);<);out;" > e.osm
perl getbound.pl -file e.osm 1104258 > e.poly
>unclosed token at line 173936, column 2, byte 9999947 at /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level/XML/Parser.pm line 187.

XML 文件格式正确,提到的行看起来很好,当我删除该行时,错误消息根本没有改变。看起来库中的某个字节计数器溢出了。

任何帮助将不胜感激! 谢谢

【问题讨论】:

  • 不是 100% 但加载到内存的内存限制是多少? 60M不会超过限制吗?
  • 将一个 60MB 的文件加载到内存中需要远远超过 60MB,但我怀疑这是问题所在。
  • Re“XML文件格式正确”,XML::Parser对此事有不同看法。
  • @ikegami xmlwf 说它格式正确
  • xmlwf 使用 expat,就像 XML::Parser 一样。所以你刚刚告诉我 expat 认为该文件是有效的,并且它认为不是。一种可能性是您测试了两个不同的文档。

标签: xml perl openstreetmap


【解决方案1】:

替换

open my $file, '<', $filename;
read $file, $osmdata, 10_000_000;

open my $file, '<', $filename;
local $/;
$osmdata = <$file>;

【讨论】:

  • 你能解释一下原来的10_000_000是做什么的吗?是缓冲区大小吗?
  • 有趣。限制从 XML 文件中读取的字节数看起来很奇怪。
  • @scai 确实很奇怪。我没有想到这种可能性。
  • @scai,我认为重点不是限制;我认为程序员认为这是一种简单的方法来 slurp 文件。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2015-01-20
  • 2011-03-17
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多