Python — записать сырые номера на диск

Мне пришло в голову, что я понятия не имею, как записать необработанные числовые значения на диск.
Как бы я сделал это в Python или C ++ ?!

Я запускаю некоторые симуляции и записываю промежуточные результаты на диск, чтобы он не начинался с нуля в случае сбоя.
К сожалению, эти значения поглощают гигабайты на гигабайтах места на моем жестком диске.

Будет ли запись числовых значений на диск по мере того, как числа с плавающей запятой, занимать значительно меньше дискового пространства или есть какие-то другие издержки, которые я не рассматриваю?

2

Решение

Наиболее универсальным и мощным вариантом является использование Формат HDF5, с помощью Интерфейс Python. С веб-сайта:

Это позволяет хранить огромное количество числовых данных, и легко
манипулировать этими данными из NumPy. Например, вы можете нарезать
мульти-терабайтные наборы данных, хранящиеся на диске, как если бы они были настоящими NumPy
массивы. Тысячи наборов данных могут храниться в одном файле,
классифицированы и помечены, как вы хотите

Он также имеет C ++ API.

Формат HDF5 широко используется в научном компьютерном сообществе и читается / пишется многими программами. Данные в формате HDF5 можно быстро обрабатывать с помощью параллельные утилиты.

2

Другие решения

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

Если вы используете Python для работы с числовыми данными, вы почти наверняка используете numpy, Если вы не используете numpy, вы должны посмотреть на использование numpy, это великолепно.

Как только вы получили ваши данные в numpy массив, вы можете просто использовать их save метод.

2

Общий метод в Python — использовать struct модуль.

import struct
print struct.pack("!d", 3.14159)

(Вы можете выбрать, какой порядок байтов использовать — я использую ! указывать порядок байтов в сети для переносимости или не использовать индикатор для использования собственного порядка байтов. На самом деле, я не уверен, что в IEEE 754 указан порядок байтов, поэтому я не уверен, что рекомендовать. Возможно, лучше использовать значение по умолчанию.)

2

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

#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;
}
1
По вопросам рекламы [email protected]