Лучший способ хранить 1 триллион строк информации - PullRequest
1 голос
/ 19 апреля 2011

Я делаю вычисления, и результирующий текстовый файл сейчас имеет 288012413 строк с 4 столбцами.Пример столбца:

288012413; 4855 18668 5.5677643628300215

файл размером почти 12 ГБ.

Это просто неразумно.Это простой текст.Есть ли более эффективный способ?Мне нужно всего около 3 знаков после запятой, но сэкономит ли ограничитель много места?

Ответы [ 8 ]

2 голосов
/ 19 апреля 2011

Продолжайте использовать базу данных MySQL

  • MSSQL Express имеет ограничение 4 ГБ
  • MS Access имеет ограничение 4 ГБ

Так чтоварианты отсутствуют.Я думаю, что использование простой базы данных, такой как mysql или sSQLLite без индексации, будет вашим лучшим выбором.Вероятно, в любом случае это будет более быстрый доступ к данным с использованием базы данных, и, кроме того, размер файла может быть меньше.

1 голос
/ 19 апреля 2011

Если вы собираетесь использовать результат в качестве справочной таблицы, зачем использовать ASCII для числовых данных?почему бы не определить структуру следующим образом:

struct x {
   long lineno;
   short thing1; 
   short thing2;
   double value;
}

и записать структуру в двоичный файл?Поскольку все записи имеют известный размер, продвигаться по ним позже легко.

1 голос
/ 19 апреля 2011

Ну

  • Первый столбец выглядит подозрительно как номер строки - если это так, то вы, вероятно, можете просто избавиться от него, сохранив около 11 символов в строке.
  • Если вам нужно только около 3 десятичных знаков, тогда вы можете округлить / усечь последний столбец, потенциально сохранив еще 12 символов в строке.

т.е. Вы можете избавиться от 23 символов в строке. Длина этой строки составляет 40 символов, поэтому вы можете примерно вдвое уменьшить размер файла.

Если вы выполните округление последнего столбца, то вам следует знать о влиянии, которое ошибки округления могут оказать на ваши вычисления - если конечный результат должен быть точным до 3 dp, то вы можете оставить пару дополнительных цифр точность в зависимости от типа расчета.

Возможно, вы захотите посмотреть на сжатие файла, если он просто используется для сохранения результатов.

1 голос
/ 19 апреля 2011

Если это просто массив данных, я бы посмотрел что-то вроде HDF5:

http://www.hdfgroup.org/HDF5/

Формат поддерживается большинством языков, имеет встроенное сжатие, хорошо поддерживается и широко используется.

1 голос
/ 19 апреля 2011

Уменьшение 4-го поля до 3 десятичных знаков должно уменьшить размер файла примерно до 8 ГБ.

0 голосов
/ 19 апреля 2011

Самый очевидный ответ - просто «разделить данные».Поместите их в разные файлы, например.1 млн строк на файл.NTFS неплохо справляется с сотнями тысяч файлов в папке.

Тогда у вас есть несколько ответов относительно уменьшения размера данных.

Далее, зачем хранить данные в виде текста, если у вас есть структура фиксированного размера?Храните числа как двоичные файлы - это еще больше сократит пространство (текстовый формат очень избыточен).

Наконец, СУБД может стать вашим лучшим другом.СУБД NoSQL должна работать хорошо, хотя я не эксперт в этой области, и я не знаю, какая из них будет хранить триллион записей.

На вашем месте я бы использовал двоичный формат фиксированного размера,где каждая запись занимает фиксированные (16-20?) байты пространства.Затем, даже если я храню данные в одном файле, я легко могу определить, с какой позиции мне нужно начать чтение файла.Если вам нужно выполнить поиск (скажем, по столбцу 1) и данные не генерируются повторно все время, то можно было бы выполнить одноразовую сортировку по ключу поиска после генерации - это будет медленно, но какодноразовая процедура была бы приемлемой.

0 голосов
/ 19 апреля 2011

Как и AShelly, но меньше.

Предполагая, что строки # являются непрерывными ...

struct x { короткая вещь1; короткая вещь2; короткое значение; // ты сказал только 3dp. поэтому храните как фиксированную точку n * 1000. Вы получаете 2 цифры слева от дп }

сохранить в двоичном файле.

lseek () read () и write () - ваши друзья.

Файл

будет большого размера (ish) на уровне 1,7 Гб.

0 голосов
/ 19 апреля 2011

хорошо, если файлы такие большие, и вы выполняете вычисления, которые требуют какой-либо точности с числами, вам не нужен ограничитель. Это может принести больше вреда, чем пользы, и с 12-15 ГБ файлом такие проблемы будет действительно трудно отладить. Я бы использовал некоторую утилиту сжатия, такую ​​как GZIP, ZIP, BlakHole, 7ZIP или что-то подобное, чтобы сжать его.

Кроме того, какую кодировку вы используете? Если вы просто храните числа, все, что вам нужно, это ASCII. Если вы используете кодировки Unicode, это удвоит размер файла в четыре раза по сравнению с ASCII.

...