Почему файлы CSV меньше файлов HDF5 при записи с помощью Pandas?

import numpy as np
import pandas as pd

df = pd.DataFrame(data=np.zeros((1000000,1)))
df.to_csv('test.csv')
df.to_hdf('test.h5', 'df')

ls -sh test*
11M test.csv  16M test.h5

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

store = pd.HDFStore('test.h5', table=True)
store['df'] = np.zeros((1000000,1))
store.close()

Редактировать: Неважно. Пример плохой! Использование некоторых нетривиальных чисел вместо нулей меняет историю.

from numpy.random import rand
import pandas as pd

df = pd.DataFrame(data=rand(10000000,1))
df.to_csv('test.csv')
df.to_hdf('test.h5', 'df')

ls -sh test*
260M test.csv  153M test.h5

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


person jeffalstott    schedule 09.03.2015    source источник


Ответы (2)


Для .csv ваш метод сохраняет такие символы:

999999,0.0<CR>

Это до 11 символов на значение. При 1 миллионе значений это приближается к 11 МБ.

HD5, кажется, хранит каждое значение как 16-байтовое число с плавающей запятой, не говоря уже о том, что это одно и то же значение снова и снова. Итак, это 16 байт * 1 000 000, что составляет примерно 16 МБ.

Храните не 0.0, а какие-то случайные данные, и .csv быстро сдувается до 25 МБ и более, а файл HDF5 остается того же размера. И хотя файл csv теряет точность, HDF5 сохраняет ее.

person chw21    schedule 09.03.2015

Кратко:

  • csv «тупые»: это один символ за раз, поэтому, если вы печатаете (скажем, четырехбайтное) число с плавающей запятой от 1,0 до десяти цифр, вы действительно используете столько байтов, но хорошая новость заключается в том, что csv хорошо сжимается, так что считайте .csv.gz.

  • hdf5 — это метаформат, и теорема Нет бесплатных обедов остается в силе: записи и значения должны храниться где-то. Что может сделать hdf5 больше.

Но вы упускаете из виду более серьезную проблему: csv — это просто текст. Что имеет ограниченную точность, тогда как hdf5 является одним из нескольких форматов binary (сериализация), которые хранят данные с более высокой точностью. Это действительно яблоки к апельсинам и в этом отношении.

person Dirk Eddelbuettel    schedule 09.03.2015
comment
В каком смысле CSV имеет ограниченную точность? Вы всегда можете записать CSV, содержащий ту же информацию, что и двоичный файл. Как правило, он менее компактен (по крайней мере, перед сжатием) и почти всегда медленнее, но вы не должны терять никакой информации, если только вы намеренно не округлили или не усекли значения перед записью значений. - person JohnE; 09.03.2015
comment
Верно в теории, но на практике я никогда не видел CSV-файлов с шестнадцатью десятичными знаками. - person Dirk Eddelbuettel; 10.03.2015
comment
Да, я согласен с этим. Просто уточняю, что CSV (и текст в целом) по своей сути не менее точен, чем двоичный. - person JohnE; 10.03.2015