繁体   English   中英

实时解析大型文本文件(Java)

[英]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.

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