将所有数据存储在内存中时的选项无法缩放

时间:2012-02-18 12:21:27

标签: java sql database nosql

我编写了一个用户在桌面上安装的Java应用程序。它抓取网站,将每个页面的数据存储在LinkedList中。该应用程序允许用户查看JTable中抓取的所有页面。

这适用于小型网站,但不能很好地扩展。目前,用户必须为更大的爬网分配更多内存(在启动Java时转换为-Xmx)。

我目前的想法是将所有数据存储在数据库中,可能使用类似HSQLDB的东西。

我还应该考虑其他方法吗?

4 个答案:

答案 0 :(得分:0)

relation db不是存储网页数据的好地方。你能把页面保存在磁盘上吗?我想搜索爬行结果。尝试apache lucene搜索引擎。在内存中一次性加载所有结果是不合理的。你可以对JTable模型进行分页,并在分页时使用软引用来缓存一些结果。

答案 1 :(得分:0)

对于这种情况,关系数据库可能是正确的方法。原因:

  • 它将使您能够处理大于内存的爬网。
  • 如果您将链接数据保存在与大量页面数据不同的表中,您仍然可以将所有链接放在内存中,这从性能和搜索角度来看非常重要
  • 它将为您提供一种简单的方法来保存已爬网的数据(以防将来需要)
  • 这是众所周知的/标准技术
  • 有很好的开源数据库实现可用(H2JavaDB可能是我的第一选择,因为它们是可嵌入的并且用纯Java编写)
  • 关系功能可能会变得有用,例如对链接数据的查询
  • 听起来您没有数据量或可用性要求可能会将您推向NoSQL类型的解决方案

答案 2 :(得分:0)

您基本上有4个选项:

  1. 将数据存储在平面文件中
  2. 将数据存储在数据库中
  3. 以某种方式将数据传输到“云”(我不知道如何)
  4. 以某种方式将数据“削减”到必需品,知道您可以在需要时重新提取完整信息
  5. 你也可以做一个4的变体来获得一些空间 - 而不是一个“丰富的”对象结构,将每个不同的数据压缩成一个String或byte []或一些你保留在数组或arraylist vs链表。这可以将存储要求降低2倍或更多。较少“面向对象”,但有时候现实介入。

答案 3 :(得分:0)

尝试将页面数据存储在对象数据库db4o http://community.versant.com中。对象数据库处理复杂对象(例如,有许多兄弟姐妹)而不是关系数据库。