数据库是记忆的合理数据结构吗?当极大量的数据需要缓存时,由一个普通的软件在内存中主动维护它可能是不合理的。数据库可以方便地存储计算结果以供以后使用,这意味着可以随时停止和启动计算,而不会影响程序的进度。如果数据库是共享的,那么处理也可以分布在多个系统(一个计算机集群)中。
我唯一的保留意见是,查询数据库造成的延迟可能会影响算法性能,特别是当算法非常快地处理许多排列时。当然,只有当算法/应用程序的空间复杂度非常高(千兆字节)时,数据库内存才是必要的。有什么想法吗?
发布于 2012-04-10 03:31:56
如果您担心在一台机器上要回答大量数据,那么这个问题的答案几乎肯定是NO!,在现代硬件上,如果答案不是no,那么要么计算有模式,要么计算应该被判定为不可行。但有几种变化是有意义的。
使用memoization的好处是,重新计算的成本比获取先前答案的成本更高。但是,如果您的答案适合RAM,那么使用数据库是没有好处的,因为只将存储放在内存中会更快。因此,对于数据库来说,唯一有趣的情况是答案不适合RAM。
为了便于讨论,我们假设每个键/值对占用高达640个字节。假设您有64 GB的RAM可用。因此,为了让它不能放入RAM,您需要超过1亿个随机创建/访问的事实。然而,让我们考虑一下实际的硬件。这些事实,当它们不适合在RAM中时,存储在硬盘驱动器中。比方说,硬盘的转速是每分钟6k转,或者说每秒100次。这使得获取/存储随机数据片段的时间平均为1/200秒(平均而言,您必须中途旋转才能找到数据)。因此,在填充数据结构后,再次随机访问它需要1亿* 0.005秒=500000秒,这几乎是590天。我们仅仅是访问数据(更不用说创建数据了)就花了几年的时间,这已经非常接近硬件的平均故障间隔时间了。(顺便说一句,这里有一些并行性我们可以利用,硬盘驱动器可以一次寻找几个磁盘扇区,但这是有限的,不会拯救你。)
其中的教训是,随机访问磁盘上的大型数据集是不可行的。即使你把一个数据库放在它前面。硬盘驱动器不是RAM,因此不应该被认为是RAM。
但并不是所有的东西都丢失了。
数据库有意义的场景是您建议的分布式计算。如果您的计算步骤很昂贵,内存调用相对较少,并且数据可以放在内存中,那么数据库是非常方便的。对数据库的调用将是快速的(内存中的东西),您不能简单地将数据保存在本地硬盘上(您的数据分散在多台机器上以使用CPU,因此没有共享硬盘),数据库可能只是因为它在那里而很方便。(我以前曾以这种方式使用过数据库,并且非常高兴。)
然而,在这个场景中,数据库只是一个键/值存储。当SQL数据库工作时,您可能想要考虑无SQL解决方案。一旦您转到非SQL解决方案,您就可以选择数据存储,其中的数据已经被分片,以便所有数据都可以放入RAM中,而不管您有多少数据。(是的,您也可以对关系数据库进行分片。据我所知,eBay是一个很好的例子,但一旦你这样做了,你往往会失去它的“关系”部分。是的,我知道有几家公司的说法与此不同,他们的说法带有重要的警告。)
实际上,当你在谷歌上进行搜索时,你就会遇到这种切分的数据存储,它包含了许多问题的记忆答案,比如哪些页面与哪些关键字匹配,哪些页面最相关。没有记忆,他们永远不可能做到这一点。但是,如果他们不得不去硬盘上寻找答案,他们也永远不会真正做到这一点。(他们也没有使用SQL...)
https://stackoverflow.com/questions/10081247
复制相似问题