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

Java 解析大型数据文件的最快文件/方式是什么?,java,xml,google-app-engine,parsing,tab-delimited-text,Java,Xml,Google App Engine,Parsing,Tab Delimited Text,所以我在做一个GAE项目。我需要查找城市,国家名称和国家代码的注册,伦敦商学院,等等 现在我想,把所有的信息放在数据存储中是相当愚蠢的,因为它会被频繁地使用,而且它会毫无理由地吃掉我的数据存储引用,特别是这些列表不会改变,所以放在数据存储中是毫无意义的 现在我有几个选择: API-付费服务没有预算,免费服务并不完全可靠 上传可解析的文件-有利的选择,因为我喜欢数据始终存在的确定性。 所以我从link得到了所有国家的源文件,以防有人需要。每个国家/地区的文件都是一个常规的UTF-8制表符分隔文件,

所以我在做一个GAE项目。我需要查找城市,国家名称和国家代码的注册,伦敦商学院,等等

现在我想,把所有的信息放在数据存储中是相当愚蠢的,因为它会被频繁地使用,而且它会毫无理由地吃掉我的数据存储引用,特别是这些列表不会改变,所以放在数据存储中是毫无意义的

现在我有几个选择:

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

上传可解析的文件-有利的选择,因为我喜欢数据始终存在的确定性。 所以我从link得到了所有国家的源文件,以防有人需要。每个国家/地区的文件都是一个常规的UTF-8制表符分隔文件,这很好

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

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

最好的方法是速度最快、资源消耗最少的方法

有效选项:

TXT文件,制表符分隔 XML文件静态 具有大量枚举的Java类 我知道将国家/地区文件作为Java枚举导入并遍历它们的值会非常快,但是您认为这会影响内存超出合理的限制吗?另一方面,每次我需要访问一条记录时,循环都会经过几千行,直到找到所需的记录。。。一行一行地读,所以没有记忆问题,但速度非常慢。。。我有过在Java servelet中解析excel文件的一些经验,仅仅解析250条记录就需要20秒左右的时间,在大规模上,响应时间无疑会超时,所以XML和excel一样吗


非常感谢大家!!请提供意见,感谢您所做的一切

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

在内存中,它应该是一个映射,从您要搜索的键映射。这将允许您像一个恒定的访问时间

内存消耗只有在它真的很大的时候才会起作用。例如,如果您需要多次访问,那么十万条记录不值得优化

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

如果列表非常大,您可以将其分解为多个较小的文件,并仅在需要时解析这些文件。一种合理、简单的划分方法是按国家对其进行划分,但任何其他的划分都会基于其名称,使用其名称的前几个字符

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

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

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


此解决方案的优点是,与纯文本/CSV/序列化映射相比,该文件可能要少得多,并且加载速度会快得多,因为DataInputStream不使用来自文本的数字解析,例如,它直接读取数字的字节。

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

在内存中,它应该是一个映射,从您要搜索的键映射。这将允许您像一个恒定的访问时间

内存消耗只有在它真的很大的时候才会起作用。例如,如果您需要多次访问,那么十万条记录不值得优化

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

如果列表非常大,您可以将其分解为多个较小的文件,并仅在需要时解析这些文件。一种合理、简单的划分方法是按国家对其进行划分,但任何其他的划分都会基于其名称,使用其名称的前几个字符

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

数据文件的改进

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

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


此解决方案的优点是,与纯文本/CSV/序列化映射相比,文件可能要少得多,而且加载速度会快得多,因为DataInputStream不使用文本中的数字解析。例如,它直接读取数字的字节。

将源格式的数据作为XML保存。在一天开始的时候,或者当它发生变化时,将它读入内存:这是您唯一需要承担解析成本的时间。然后有两个主要选项:

内存中的表单仍然是一个XML树,您可以使用XPath/XQuery来查询它

b内存中的表单类似于java HashMap


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

将源格式的数据保存为XML。在一天开始的时候,或者当它发生变化时,将它读入内存:这是您唯一需要承担解析成本的时间。然后有两个主要选项:

内存中的表单仍然是一个XML树,您可以使用XPath/XQuery来查询它

b内存中的表单类似于java HashMap


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

不,XML解析在速度上无法与excel解析相比。使用sax/stax的XML速度非常快。为什么不是一个数据库?枚举是一个不错的选择,如果与一个键相关联的数据太多,您的内存无法容纳,您可以使用枚举简单地定位一个条目,然后解析它。您甚至可以在内存中保留一个最常用的解析列表。不,XML解析在速度上无法与excel解析相比。使用sax/stax的XML速度非常快。为什么不是一个数据库?枚举是一个不错的选择,如果与一个键相关联的数据太多,您的内存无法容纳,您可以使用枚举简单地定位一个条目,然后解析它。你甚至可以在内存中保留最常用的解析列表。非常感谢!!真有见地!!喜欢自定义二进制文件解决方案。。。会给它一个机会,让你知道!关于自定义二进制格式:看看Cap'n Proto或protocol buffers之类的东西:您也许可以使用它。非常感谢!!真有见地!!喜欢自定义二进制文件解决方案。。。会给它一个机会,让你知道!关于自定义二进制格式:看看Cap'n Proto或protocol buffers之类的东西:您也许可以使用它。