Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以类似SAX的方式从磁盘二进制搜索XML?可能的_Xml_Ios_Xml Parsing_Sax_Binary Search - Fatal编程技术网

以类似SAX的方式从磁盘二进制搜索XML?可能的

以类似SAX的方式从磁盘二进制搜索XML?可能的,xml,ios,xml-parsing,sax,binary-search,Xml,Ios,Xml Parsing,Sax,Binary Search,我发现自己需要在一个(可能的)大XML文件中以动画帧类型的速度搜索具有特定时间戳的项目 我在最近的一个项目中也做过类似的事情,但是XML小到可以放入内存,所以我将其解析成一个简单对象数组,并对其进行二进制搜索。繁荣超快速搜索每帧800多个带时间戳的项目 这一次,XML文件可能大到足以让解析它们到内存中成为一个愚蠢的想法(这是iOS的东西,所以RAM是有限的)。我脑海中的解决方案是从文件中进行类似SAX的流解析,但要使用可设置的指针。因此,我可以在另一个二进制搜索中在文件周围跳转该指针,解析文件中

我发现自己需要在一个(可能的)大XML文件中以动画帧类型的速度搜索具有特定时间戳的项目

我在最近的一个项目中也做过类似的事情,但是XML小到可以放入内存,所以我将其解析成一个简单对象数组,并对其进行二进制搜索。繁荣超快速搜索每帧800多个带时间戳的项目

这一次,XML文件可能大到足以让解析它们到内存中成为一个愚蠢的想法(这是iOS的东西,所以RAM是有限的)。我脑海中的解决方案是从文件中进行类似SAX的流解析,但要使用可设置的指针。因此,我可以在另一个二进制搜索中在文件周围跳转该指针,解析文件中的下一个完整节点,并使用它来通知搜索指针下一个跳转的位置

我认为这是一个很好的理论。然而,环顾互联网,我还没有找到一个SAX解析器,允许在文件中设置其当前行号。很多人给你只读访问权限作为一种状态,但没有人允许如此重要的位置设置


所以。有人知道有这样一个XML解析库吗?同样,这是iOS世界,所以任何基于C/C++的东西都可以,但如果它有一个Obj-C包装器,就有额外的好处。

在XML中你不能安全地做到这一点,至少不能直接做到。您说过要跳转到某个行号,但这可能对您没有帮助,因为XML不是基于行的。而且您不能轻松跳转到某个节点的第n个子节点,因为这需要完全解析XML

您可以做的是首先解析整个文件并创建一个索引:对于每个节点(您需要跳转到的节点),您可以记住它在文件中的起始位置(可能是字节偏移量)。您可以使用SAX(或类似SAX的)解析器来实现这一点,您不需要将整个文档都放在内存中

如果这样做,您必须一次性解析整个文件(O(n)操作),但是您可以跳转任何节点并快速解析(在O(1)中),这将使二进制搜索性能更好


或者,您可以根据要搜索的属性创建索引。如果您这样做,整个二进制搜索将在内存中,您可以只解析所需的一个(或几个)节点,这应该会更快。

在XML中无法安全地完成这项工作,至少不能直接解析。您说过要跳转到某个行号,但这可能对您没有帮助,因为XML不是基于行的。而且您不能轻松跳转到某个节点的第n个子节点,因为这需要完全解析XML

您可以做的是首先解析整个文件并创建一个索引:对于每个节点(您需要跳转到的节点),您可以记住它在文件中的起始位置(可能是字节偏移量)。您可以使用SAX(或类似SAX的)解析器来实现这一点,您不需要将整个文档都放在内存中

如果这样做,您必须一次性解析整个文件(O(n)操作),但是您可以跳转任何节点并快速解析(在O(1)中),这将使二进制搜索性能更好

或者,您可以根据要搜索的属性创建索引。如果这样做,整个二进制搜索将在内存中,您可以只解析所需的一个(或几个)节点,这应该会更快