繁体   English   中英

什么是解析大型数据文件最快的文件/方式?

[英]What is the fastest file / way to parse a large data file?

所以我正在做一个GAE项目。 我需要查找城市,国家名称和国家代码以进行注册,LBS等...

现在,我发现将所有信息放入数据存储区是非常愚蠢的,因为它将被频繁使用,并且它会无缘无故地吞噬我的数据存储区报价,特别是这些列表将发生变化,因此将其毫无意义地放入数据存储区。

现在剩下一些选择:

API-付费服务没有预算,免费服务并不完全可靠。

上传可解析的文件-有利的选项,因为我喜欢确定数据将始终存在的可能性。 因此,我从GeoNames获得了所需的文件(链接包含所有国家/地区的源文件,以防有人需要)。 每个国家/地区的文件都是标准的UTF-8制表符分隔文件,非常好。

但是,既然我现在可以选择如何格式化和访问数据,那么问题是:

从Javaservelet容器中的静态文件系统地格式化和检索数据的最佳方法是什么?

最好的方法是最快,最省资源的方法。

有效选项:

  1. TXT文件,制表符分隔
  2. XML文件静态
  3. 带有大量枚举的Java类

我知道将国家文件作为Java枚举导入并通过它们的值将非常快,但是您是否认为这会超出合理的范围影响内存? 另一方面,每次我需要访问一条记录时,循环将遍历几千行,直到找到所需的记录为止……逐行读取,因此没有内存问题,但是速度非常慢……有一些在Java servelet中解析excel文件的经验,花了大约20秒钟才能解析250条记录,大规模的响应时间会超时(毫无疑问),XML就像excel一样吗?

非常感谢你们 !! 请提供意见,所有一切都值得赞赏!

最简单,最快的方法是将文件作为静态Web资源文件保存在WEB-INF文件夹下,并在应用程序启动时使用上下文侦听器将文件加载到内存中。

在内存中,它应该是Map ,它是您要搜索的键的映射。 这样您将获得恒定的访问时间。

内存消耗只有在确实很大的情况下才重要。 例如,如果需要多次访问,那么十万条记录就不值得优化。

静态文件应为纯文本格式或CSV,它们的读取和解析效率最高。 不需要XML格式,因为解析起来会很慢。

如果列表确实很大,则可以将其分解为多个较小的文件,并且仅在需要时才解析它们。 一个合理,简单的分区将是按国家/地区对其进行划分,但其他任何分区都可以使用(例如,根据其名称,使用其名称中的前几个字符)。

您也可以考虑一次在内存中构建此Map ,然后将此映射序列化为二进制文件,并将该二进制文件作为静态资源文件包括在内,这样,您只需反序列化此Map ,就无需将其解析/处理为文本文件并自己构建对象。

数据文件的改进

将静态资源文件作为文本/ CSV文件或序列化的Map数据文件的替代方法是,将其作为二进制数据文件,您可以在其中创建自己的自定义文件格式。

使用DataOutputStream ,可以以非常紧凑和高效的方式将数据写入二进制文件。 然后,您可以使用DataInputStream从此自定义文件加载数据。

该解决方案的优点是文件可能更少(与纯文本/ CSV /序列化的Map相比),并且加载速度更快(因为DataInputStream不使用文本中的数字解析,例如,它读取字节)的数字直接)。

将数据保留为XML的源形式。 一天开始时或更改时,将其读入内存:这是您唯一的解析费用。 然后有两个主要选项:

(a)您的内存中表单仍然是XML树,并且您使用XPath / XQuery对其进行查询。

(b)您的内存形式类似于Java HashMap

如果数据非常简单,则(b)可能是最好的,但它只允许您执行一种硬编码的查询。 如果数据更复杂或您有各种可能的查询,则(a)会更灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM