Вместо того, чтобы хранить 360 миллиардов 1 граммов снова и снова для каждой пары или группы 2+, лучше сохранить слова один раз, а затем использовать меньшие целые числа для представления слов.
(Я резюмировал свои оценки ниже.)
Трудно сказать наверняка, что здесь лучше использовать целые числа. Вам нужны более точные оценки того, сколько места на диске вам нужно, сколько места на диске у вас есть и сколько места на диске вы можете себе позволить.
Статистика говорит нам, что средняя длина слова в английском языке составляет 5,1 символа. В вашем приложении это то же самое, что 5,1 байта. Средняя длина двух слов составляет около 10,2 байта; длина двух целых чисел составляет 8 байт.
В файле номер 71 около 66 миллионов 2 граммов (выбранных случайным образом). При размере 10,2 байта на запись вы получаете около 673 мегабайт для этого файла. (Это предполагает, что вы собираетесь хранить только слова, а не количество.) Для 100 2-граммовых файлов вам потребуется от 52 до 67 гигабайт (без учета индексов). Добавьте 50% за наше глубокое невежество. 100 гигов покроют 2 грамма.
Если вы храните счетчики со словами, этот файл составляет 1,6 гига, и 100 из них должны составлять около 160 гигов. Таким образом, у нас есть диапазон от 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. Экономия 7 байтов на каждой из 10 строк, 70 байтов. Требуется одно соединение для получения реальных данных. Для этого подхода я бы оценил около 130 гигабайт для всех 2 граммов, исключая индексы и таблицу, которая предоставляет внешние ключи.
Сводка моих оценок пространства, необходимого для хранения 2 граммов, на основе 100 файлов с 66 миллионами строк. Исключая пространство для индексов и общие накладные расходы на хранение (которые, в зависимости от СУБД, могут быть значительными).
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)
Многотерабайтные дисковые массивы в наши дни не так уж и дороги. Вы все собираетесь зарабатывать на этом деньги?
person
Mike Sherrill 'Cat Recall'
schedule
10.10.2011