我有100万亿个元素,每个元素的大小从1字节到1万亿字节(0.909 TiB)。如何存储和访问它们非常有效?

时间:2011-12-10 01:28:03

标签: algorithm data-structures save large-data-volumes

这是一个采访问题:

  

假设:   我有100万亿个元素,每个元素的大小从1字节到1万亿字节(0.909 TiB)。   如何存储和访问它们非常有效?

我的想法: 他们希望测试有效处理大量数据的知识。 这不仅仅是一个正确答案的问题。

将它们保存为一些特殊的数据结构?

实际上我对这种开放式问题没有任何想法。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

这实际上取决于所讨论的数据集。我认为关键在于您讨论替代方案并描述各种利弊。

也许你应该回答他们更多问题的问题!

  • 如何进行访问? (顺序,随机,一些可预测的分布?)
  • 元素的顺序是否重要?
  • 元素的大小会改变吗?
  • 插入/移除性能有多重要?

您选择的数据结构取决于您愿意做出哪些权衡取舍。

例如,如果您只需要按顺序遍历集合,也许您可​​以使用链表,因为它具有相对较小的存储开销。

如果您需要随机访问,您可能需要查看:

  • 哈希表(恒定时间查找,但需要一个良好的数据哈希函数)
  • 某种索引/树结构?
  • 缓存!您可能无法将其全部保留在内存中 - 即使您可以在可能的情况下利用数据位置。

TL; DR:这一切都与问题有关。有很多选择。

这与文件系统/数据库面临的问题基本相同。

答案 1 :(得分:2)

我会使用B-tree的分布式形式。 B-tree能够以非常好的访问时间存储大量数据(树通常不是很深,但非常广泛)。由于此属性,它用于关系数据库中的索引。在许多节点(计算机)中分发它也不是很困难。

我认为,这个答案必须足以接受采访......

答案 2 :(得分:2)

最简单和最低成本(至少在你大规模扩展之前)选项是使用像Amazon S3这样的现有服务。

答案 3 :(得分:1)

好吧,我会使用DHT并将其分成8MB的块。然后有一个包含filehash(SHA-1 256),文件名和块的表。

块将存储在3个不同NAS中的块中。拥有1200 TB NAS服务器和负载均衡器,可以获得当时更方便获取的3个副本中的任何一个。