我一直在为Raspberry PI制作Java程序,但我遇到了问题。
程序从设备读取数据并使用DOM将其保存在XML文件中。我的问题是,当我们向XML添加信息时,写入更多信息会逐渐变慢。我们谈论的是,只要它有10个条目无关紧要,它就会成为一个巨大的瓶颈,以至于它最终需要更长的时间来编写XML而不是从设备读取数据的频率。
我认为问题在于它会在每次需要写的新文章时重写整个文件。所以我读了整个XML,添加了我想要的条目并将其全部写回来。我需要一种方法来在文件中添加新条目而不读取所有数据。
我找了一个允许这个但却找不到它的XML API。
所以我的问题是:
我被告知DOM非常慢所以这是一个问题,因为我正在使用DOM?或者这只是Raspberry PI读取速度慢的结果。
您是否可以推荐一个非常轻量级的XML API,它只允许添加和读取XML文件的特定部分?这是什么意思,当它说Stax流XML文件?
我正在将所有内容改写为json(因为我被告知它更快)但是这样做我想知道我的问题是否会持续存在因为我将不可避免地读取整个文件并再次写入整个文件
将数据附加到文本文件的最轻量级方法是什么?数据将始终添加到文件的末尾,所以我想知道是否只使用普通的旧文本文件不是最好的解决方案吗?
答案 0 :(得分:1)
如果我理解正确,那么每次发生某些事件时,您都会尝试更新 XML文件。也就是说,当事件发生时,您:
这不符合XML的优势,你最好使用适合随机访问写入的文件格式。查看JDBM2,甚至是像H2这样的轻量级SQL数据库。
如果你真的必须有一个XML文件,你可以考虑在程序开始时一次读取它,将DOM保存在内存中,按计划写入文件(如果已更改),在线程的单独线程中更新它。
如果采用这种方法,请使用synchronized
方法确保在文件写入期间不修改DOM。
答案 1 :(得分:0)
我可以用树莓派证明JSon的速度。即使读取整个文件并在JSon中写出也会比DOM快得多。
我的应用程序读入> 500个JSon字符串,并在不到一秒的时间内写回相同的数量。如果您不需要更新数据,那么只需打开一个文件,使用标签" ab"将允许您附加到文件,而不是覆盖现有数据。
答案 2 :(得分:0)
事实证明,XML编写实际上很快就会对我正在做的事情以及减慢整个系统的速度以及造成瓶颈的原因是我正在写入数据库,但是当没有互联网时,连接超时就在2分钟,所以线程将开始堆积等待超时结束,以便他们可以将数据写入XML文件。