[英]Parsing Large Text Files in Real-time (Java)
我有兴趣在Java(1.6.x)中解析一个相当大的文本文件,并想知道哪种方法被认为是最佳实践?
该文件的大小可能约为1Mb,并且将包含数千个条目;
Entry
{
property1=value1
property2=value2
...
}
等等
我的第一直觉是使用正则表达式,但我之前没有在生产环境中使用Java的经验,所以我不确定java.util.regex类有多强大。
为了澄清一点,我的应用程序将成为一个Web应用程序(JSP),它解析有问题的文件并显示它检索的各种值。 只有一个文件被解析(它驻留在主机上的第三方目录中)。
该应用程序的使用率相当低(可能只有少数用户每天使用它几次),但至关重要的是,当他们使用它时,会尽快检索信息。
另外,每次解析文件时,是否有任何预防措施可以将文件加载到内存中?
谁能推荐一种方法来接受这里?
谢谢
如果它大概是1MB并且按你所声明的格式,那么听起来你就是过度工程。
除非您的服务器是ZX Spectrum或其他东西,只需使用正则表达式来解析它,敲击哈希映射中的数据(并将其保留在那里),并且不用担心它。 它会占用几兆内存,但那又是什么......?
更新:为了让您对性能有一个具体的了解,我对String.split() (使用正则表达式)的性能进行了一些测量,结果显示在2GHz机器上, 分割10,000个100个字符的字符串需要几毫秒换句话说,大约1兆字节的数据 - 实际上在纯字节量中接近2MB,因为字符串是每个字符2个字节)。 很明显,这不是你正在进行的操作,但你明白我的意思:事情并不是那么糟糕......
如果它是正确的语法,请使用解析器构建器,例如GOLD解析系统 。 这允许您指定格式并使用有效的解析器来获取所需的令牌,几乎可以免费获得错误处理。
我想知道为什么这不是XML,然后你可以利用可用的XML工具。 我特别想到SAX,在这种情况下,您可以轻松地解析/处理它而不必将其全部保存在内存中。
那你可以把它转换成XML吗?
如果你不能,并且你需要一个解析器,那么看看JavaCC
使用Scanner类并一次处理一行文件。 我不确定你为什么提到正则表达式。 正则表达式几乎永远不是任何解析问题的正确答案,因为在什么情境下发生的模糊性和缺乏语法控制。
您可以使用Antlr解析器生成器来构建能够解析文件的解析器。
没有回答关于解析的问题......但是你可以在新文件到达时解析文件并生成静态页面。 所以你没有性能问题...(我认为1Mb不是一个大文件所以你可以将它加载到内存中,只要你不同时加载太多文件......)
这看起来像一个简单的文件格式,因此您可以考虑使用递归下降解析器 。 与JavaCC和Antlr相比,它的优点是你可以编写一些简单的方法,获得所需的数据,而不需要学习解析器生成器的形式。 它的缺点 - 可能效率较低。 递归下降解析器原则上比正则表达式更强。 如果您可以为此文件类型提供语法,它将为您提供所选的任何解决方案。
如果这是您想知道的Java正则表达式的限制,请不要担心。 假设你有能力制作正则表达式,性能应该不是问题。 功能集也非常丰富 - 包括我最喜欢的占有量词 。
另一种解决方案是进行某种形式的预处理(离线完成或作为cron作业),它产生一个非常优化的数据结构,然后用于服务许多Web请求(无需重新解析文件)。
但是,看看有问题的情景,似乎并不需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.