使用java实现一个非常大的队列

时间:2010-10-16 09:16:34

标签: java

我有一个问题。 我曾经在采访中被问过这个问题 -

假设您有一个队列。一个包含对象的非常大的队列。而你无法将这个队列放在内存中。那么你如何实现它,以便你可以从队列的末尾添加。并从队列的开头删除。这个解决方案是如何用Java实现的? 有什么建议.. ??

3 个答案:

答案 0 :(得分:1)

我认为一种方法是将对象序列化到磁盘上或将它们存储到数据库中。

答案 1 :(得分:1)

至少有两种方法,一种是将数据存储在平面文件中,另一种方法是将数据存储在数据库中。

如果是平面文件,则创建一个文件格式,如:

[current position]<-- here is no new line
[data    1 length][data    1 in serialized format]<-- here is no new line
[data    2 length][data    2 in serialized format]
[data    3 length][data    3 in serialized format]
[data etc. length][data etc. in serialized format]

当你有:

  • 推送(),您追加到文件
  • pop (),您使用 RandomAccess 搜索结束当前[current position]上的元素,并在此增量之后{{ 1}}与[current position]

如果是数据库,则创建一个表格,如:

[data    x length]

当你有:

  • 推送(),您追加到数据库
  • pop (),你在current_item ++中使用查询元素的id;什么存储在你的班级信息。

更多注意事项:如果您需要删除元素,那么如果您在 pop()后立即删除项目可能会更好,但是稍后会删除多个项目。您阅读时应该更多然后一个元素,并且每次需要时都不会打扰文件 / 数据库一件物品。

答案 2 :(得分:0)

您可以购买价格合理的服务器,内存为48 Gb。如果在处理数据方面落后超过48 GB,那么将数据写入磁盘只会使情况变得更糟,而不是更好。 (写入磁盘的速度比写入内存慢100,000倍,如果你的数据落后,则不是你需要的东西)

一种解决方案是每个对象/任务使用更少的内存(更高效的结构或压缩)或获得更多内存。 (通常比开发者时间便宜得多)

可能会有更好的解决方案;减慢生产者,合并任务或放弃任务。