Эффективный формат вывода для огромных наборов данных? - PullRequest
1 голос
/ 08 октября 2019

Я написал программу, которая записывает вывод в файл. Выходные данные представлены в 6-колоночном формате с n строками, а все значения имеют плавающую двойную точность. В моем коде очень часто, когда n становится очень большим (1e20 или около того), и, следовательно, файл выходных данных также становится очень большим.

В настоящее время я храню все в формате * .csv, что, очевидно,приводит к огромным файлам данных. Есть ли более эффективный способ хранения таких значений? Любой новый формат файла или любой новый метод, который значительно уменьшил бы размер файла?

Для пояснения: данные не должны быть удобочитаемыми для человека, двоичный файл вполне подойдет. Далее я буду обрабатывать данные в файле, чтобы получить некоторые важные параметры из прогонов, вероятно, расстояние перемещения, время выхода в определенной точке и т. Д. Код на самом деле представляет собой астрофизическое моделирование движущихся частиц и для приблизительно 1e10 частиц длямиллион временных шагов каждый, это становится довольно высоким для размера.

1 Ответ

0 голосов
/ 08 октября 2019

При разработке формата файла вы должны учитывать различные вещи, такие как:

a) Есть ли вероятность того, что файл мог быть поврежден или злонамеренно подделан (или есть какое-либо требование конфиденциальности))? Ответ на это почти всегда "да". Чтобы защититься от этих вещей, вы должны рассмотреть какую-то контрольную сумму и / или шифрование. Вам также может понадобиться подумать о том, желательно ли частичное восстановление (например, полезно ли разбивать файл на несколько блоков / секций, где каждый блок имеет свою собственную контрольную сумму / шифрование, так что если 4 байта в одном блоке / секции повреждены, вы все равно можетевосстановить большинство данных).

b) Есть ли проблемы с переносимостью? Например, если вы сохраните необработанные значения double в файле, это создаст проблему на других компьютерах, которые имеют другой двоичный формат для "double"?

c) Для каждого типа значения;Какой диапазон фактически должен быть представлен и каковы требования к точности? Обычно программное обеспечение использует «больше и точнее», чем необходимо (часто потому, что быстрее выбрать следующий по величине тип, поддерживаемый процессором);но для форматов файлов это вызывает ненужное увеличение размеров файлов. Для простого примера;возможно, вы могли бы преобразовать (64-разрядный) double в 32-разрядный формат с фиксированной точкой и уменьшить вдвое используемое пространство, при этом достигая необходимого диапазона и точности.

d) Есть ли "умные"способы уменьшить диапазон и точность, необходимые для некоторых значений? Для простого примера;может быть, у вас есть «начальное значение» и «конечное значение», которым нужно 64 бита;но вы можете преобразовать его в «начальное значение» и «разницу» (чтобы «конечное значение» можно было вычислить как «начальное значение + разница»), где значения «разница» имеют меньший диапазон и для хранения требуется только 32 бита.

e) Полезен ли какой-либо вид индексации? Для простого примера;если файл может содержать 1 миллион записей, и вы хотите найти только одну, то вы можете использовать индекс, чтобы найти смещение для нужной записи, и загрузить только эту одну запись (и избежать загрузки всех 1 миллиона записей).

f) Какие еще метаданные вы могли бы хотеть? Это могут быть такие вещи, как «волшебная подпись» (чтобы программное обеспечение могло проверять, должен ли файл соответствовать формату файла, а пользователь не указал в программе неправильный тип файла), «номер версии формата файла»(чтобы программа могла выполнить «автоматическое обновление до нового формата файла» или, по крайней мере, определить, когда файл использует устаревший / устаревший формат файла, который больше не поддерживается). Он также может включать информацию для определения того, кем был автор, откуда были получены данные, когда были получены данные, какая программа создала / подготовила файл и т. Д. Иногда имеются также необязательные данные и флаги, указывающие, являются ли необязательные данныевключено / не включено в файлВам также могут потребоваться такие вещи, как «количество записей» и «смещение в файле для каждой отдельной области» и т. Д.

g) Какие виды разрешений вам необходимо сделать для расширяемости (и обратной совместимости, и пересылкисовместимость)? Обычно люди оставляют такие вещи, как (например) поля «зарезервировано для будущего использования» в заголовках, чтобы они могли добавлять / изменять / расширять формат файла в будущем, не нарушая ничего. Иногда это даже более конкретно о том, что должно делать программное обеспечение, когда оно видит значения в зарезервированных полях, которые оно не поддерживает - например, «зарезервировано для будущего использования, должно быть равно нулю, если ненулевое программное обеспечение должно игнорировать это значение« против », зарезервированодля будущего использования должен быть равен нулю, если ненулевое (из-за будущего использования) программное обеспечение должно генерировать ошибку и не использовать файл "

h). Полезны ли какие-либо методы сжатия? Для простого примера, если у вас есть «6 столбцов, N строк» ​​с индексом, а иногда данные для 2 или более строк оказываются одинаковыми;тогда, возможно, вы можете сохранить только одну копию данных для этих строк и затем использовать индекс, чтобы выяснить, какая строка использует какие данные (немного похоже на «row[n] = unique_row_data[ index[n] ]»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...