Вместо того, чтобы хранить 360 миллиардов 1грамм снова и снова для каждой пары или 2+ групп - Хранить слова один раз - и затем использовать меньшие целые числа для представления слов, кажется лучшим выбором.
(я суммировал свои оценки ниже.)
Трудно сказать, что целые числа - лучший выбор здесь.Вам нужны более точные оценки того, сколько дискового пространства вам нужно, сколько дискового пространства у вас есть, и сколько дискового пространства вы можете себе позволить.
Статистика говорит нам, что средняя длина слова в английском языке составляет 5,1 символа.В вашем приложении это то же самое, что 5,1 байта.Средняя длина двух слов составляет около 10,2 байта;длина двух целых чисел составляет 8 байтов.
В файле 71 содержится около 66 миллионов 2грамм (выбранных случайным образом).При 10,2 байт на запись вы ищете около 673 мегабайт для этого файла.(Предполагается, что вы будете хранить только слова, а не количество.) Для 100-граммовых файлов вам потребуется от 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 миллионовстрок.Исключая пространство для индексов и общих накладных расходов на хранение (которые, в зависимости от 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)
Многотерабайтные дисковые массивы в наши дни не слишком дороги.Вы собираетесь зарабатывать на этом?