与其为每对或 2+ 个分组一遍又一遍地存储 3600 亿个 1 克 - 将单词存储一次 - 然后使用更小的整数来表示单词似乎是一个更好的选择。
(我在下面总结了我的估计。)
很难确定整数在这里是更好的选择。您需要更好地估计您需要多少磁盘空间、您拥有多少磁盘空间以及您可以负担多少磁盘空间。
统计数据告诉我们,英语单词的平均长度是 5.1 个字符。在您的应用中,这与 5.1 字节相同。两个字的平均长度约为10.2字节;两个整数的长度为 8 个字节。
文件编号 71(随机选择)中大约有 6600 万个 2 克。在每个条目 10.2 字节的情况下,您正在查看该文件的大约 673 兆字节。(假设您只存储单词,而不是计数。)对于 100 个 2 克文件,您应该需要 52 到 67 个演出(忽略索引)。为我们深刻的无知增加 50%。100 个演出将涵盖 2 克。
如果你用单词存储计数,这个文件是 1.6 gigs,其中 100 个应该是 160 gigs 左右。所以我们有 100 到 160 个演出的范围来存储 2 克。
我将估算索引所需的空间留给您。
整数每个字节省 2.2 个字节。但是存储两个整数意味着您总是需要进行两次连接才能取回真实数据。(为 5 克存储五个整数意味着您需要五个连接来获取真实数据。)存储单词本身不需要连接来获取真实数据。
如果您还存储计数,则可以通过将外键存储到 ngram 而不是使用单个单词来节省空间。所以你可以存储
ngram_id ngram_text
--
143564 five pounds
在一张桌子上,并且
ngram_id year match_count page_count volume_count
--
143564 1999 4 3 3
143564 2000 2 2 1
143564 2001 1 1 1
143564 2002 1 1 1
143564 2003 2 2 2
143564 2004 1 1 1
143564 2005 6 6 5
143564 2006 30 21 17
143564 2007 39 37 26
143564 2008 44 41 28
在另一个。
对于特定的 2 克,文本占用 11 个字节,整数占用 4 个字节。10 行中的每一行节省 7 个字节,70 个字节。需要一次连接才能获取真实数据。对于这种方法,我估计所有 2 克大约需要 130 个演出,不包括提供外键的索引和表。
基于 6600 万行的 100 个文件,我对存储 2 克所需空间的估计摘要。不包括索引空间和一般存储开销(取决于 dbms,这些开销可能很大。)
row_len gigabytes joins
----------------------------------------------------
words with counts 163.2 1,077 0
two integers with counts 128.0 845 2-5
words without counts 10.2 67 0
two integers without counts 8 53 2-5
one integer with counts 20 132 1
one integer without counts 4 26 (for completeness, but not really useful)
如今,多 TB 驱动器阵列并不昂贵。大家会靠这个赚钱吗?