我有一个问题。 我曾经在采访中被问过这个问题 -
假设您有一个队列。一个包含对象的非常大的队列。而你无法将这个队列放在内存中。那么你如何实现它,以便你可以从队列的末尾添加。并从队列的开头删除。这个解决方案是如何用Java实现的? 有什么建议.. ??
答案 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]
当你有:
[current position]
上的元素,并在此增量之后{{ 1}}与[current position]
。[data x length]
当你有:
更多注意事项:如果您需要删除元素,那么如果您在 pop()后立即删除项目可能会更好,但是稍后会删除多个项目。您阅读时应该更多然后一个元素,并且每次需要时都不会打扰文件 / 数据库一件物品。
答案 2 :(得分:0)
您可以购买价格合理的服务器,内存为48 Gb。如果在处理数据方面落后超过48 GB,那么将数据写入磁盘只会使情况变得更糟,而不是更好。 (写入磁盘的速度比写入内存慢100,000倍,如果你的数据落后,则不是你需要的东西)
一种解决方案是每个对象/任务使用更少的内存(更高效的结构或压缩)或获得更多内存。 (通常比开发者时间便宜得多)
可能会有更好的解决方案;减慢生产者,合并任务或放弃任务。