Мне пришло в голову, что я понятия не имею, как записать необработанные числовые значения на диск.
Как бы я сделал это в Python или C ++ ?!
Я запускаю некоторые симуляции и записываю промежуточные результаты на диск, чтобы он не начинался с нуля в случае сбоя.
К сожалению, эти значения поглощают гигабайты на гигабайтах места на моем жестком диске.
Будет ли запись числовых значений на диск по мере того, как числа с плавающей запятой, занимать значительно меньше дискового пространства или есть какие-то другие издержки, которые я не рассматриваю?
Наиболее универсальным и мощным вариантом является использование Формат HDF5, с помощью Интерфейс Python. С веб-сайта:
Это позволяет хранить огромное количество числовых данных, и легко
манипулировать этими данными из NumPy. Например, вы можете нарезать
мульти-терабайтные наборы данных, хранящиеся на диске, как если бы они были настоящими NumPy
массивы. Тысячи наборов данных могут храниться в одном файле,
классифицированы и помечены, как вы хотите
Он также имеет C ++ API.
Формат HDF5 широко используется в научном компьютерном сообществе и читается / пишется многими программами. Данные в формате HDF5 можно быстро обрабатывать с помощью параллельные утилиты.
Вы можете свернуть свой собственный двоичный формат и использовать его, но это, вероятно, плохая идея.
Если вы используете Python для работы с числовыми данными, вы почти наверняка используете numpy
, Если вы не используете numpy
, вы должны посмотреть на использование numpy
, это великолепно.
Как только вы получили ваши данные в numpy
массив, вы можете просто использовать их save
метод.
Общий метод в Python — использовать struct
модуль.
import struct
print struct.pack("!d", 3.14159)
(Вы можете выбрать, какой порядок байтов использовать — я использую !
указывать порядок байтов в сети для переносимости или не использовать индикатор для использования собственного порядка байтов. На самом деле, я не уверен, что в IEEE 754 указан порядок байтов, поэтому я не уверен, что рекомендовать. Возможно, лучше использовать значение по умолчанию.)
Перед оптимизацией убедитесь, что вы, по крайней мере, делаете что-то подобное (сохраняя ваш числовой тип в двоичном представлении на диске). Если вы находитесь в этой точке, а размеры файлов все еще слишком велики, вы можете рассмотреть различные типы сжатых форматов.
#include <iostream>
#include <fstream>
typedef int32_t my_numeric_type;
int main()
{
using namespace std;
{
ofstream output_file("numbers.dat", ios::binary);
if( !output_file )
{
cout << "Failed to open file for writing" << endl;
return 1;
}
for( my_numeric_type i = 0 ; i <= 1000; ++i )
output_file.write(reinterpret_cast<const char*>(&i), sizeof(i));
}
{
ifstream input_file("numbers.dat", ios::binary);
if( !input_file )
{
cout << "Failed to open file for reading" << endl;
return 1;
}
my_numeric_type i;
while( input_file.read(reinterpret_cast<char*>(&i), sizeof(i)) )
cout << i << endl;
}
return 0;
}