Попытка уменьшить размер файла HDF5, изменив типы полей индекса с помощью h5py

У меня есть очень большой файл CSV (~ 12 ГБ), который выглядит примерно так:

posX,posY,posZ,eventID,parentID,clockTime -117.9853515625,60.2998046875,0.29499998688697815,0,0,0 -117.9853515625,60.32909393310547,0.29499998688697815,0,0,0 -117.9560546875,60.2998046875,0.29499998688697815,0,0,0 -117.9560546875,60.32909393310547,0.29499998688697815,0,0,0 -117.92676544189453,60.2998046875,0.29499998688697815,0,0,0 -117.92676544189453,60.32909393310547,0.29499998688697815,0,0,0 -118.04051208496094,60.34012985229492,4.474999904632568,0,0,0 -118.04051208496094,60.36941909790039,4.474999904632568,0,0,0 -118.04051208496094,60.39870834350586,4.474999904632568,0,0,0

Я хочу преобразовать этот файл CSV в формат HDF5, используя библиотеку h5py, а также уменьшить общий размер файла, установив типы полей/индексов i.G. говоря:

Сохраните posX, posY и posZ как float32. Сохраните eventID, parentID и clockTime как int32 или что-то в этом роде.

Примечание. Мне нужно разделить данные в какой-либо форме, когда я их читаю, чтобы избежать ошибок памяти.

Однако я не могу получить желаемый результат. Что я пробовал до сих пор: Используя собственные методы Pandas, следуя этому руководству: Как записать большой файл csv в hdf5 в python? Это создает файл, но я почему-то не могу изменить типы, и файл остается слишком большим (~ 10,7 ГБ). Типы полей — float64 и int64.

Я также попытался разбить CSV на части (используя split -n x myfile.csv), прежде чем работать с приращениями. Я столкнулся с некоторыми ошибками данных в начале и в конце каждого файла, которые я смог исправить, удалив указанные строки с помощью sed. Затем я попробовал следующий код:

import pandas as pd
import h5py

PATH_csv = "/home/MYNAME/Documents/Workfolder/xaa" #xaa is my csv increment
DATA_csv = pd.read_csv(PATH_csv)

with h5py.File("pct_data-hdf5.h5", "a") as DATA_hdf:
    dset = DATA_hdf.create_dataset("posX", data=DATA_csv["posX"], dtype = "float32")

К сожалению, это создало файл и таблицу, но не записало в нее никаких данных.

Ожидание Создание файла HDF5, содержащего данные большого файла CSV, а также изменение типа переменной каждого индекса.

Если что-то непонятно, прошу разъяснений. Я еще новичок!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы рассматривали модуль numpy? У него есть удобная функция (genfromtxt) для чтения данных CSV с заголовками в массив Numpy. Вы определяете dtype. Массив подходит для загрузки в HDF5 с помощью функции h5py.create_dataset().

См. код ниже. Я включил 2 оператора печати. Первый показывает имена dtype, созданные из заголовков CSV. Второй показывает, как вы можете получить доступ к данным в массиве numpy по имени поля (столбца).

import h5py
import numpy as np

PATH_csv = 'SO_55576601.csv'
csv_dtype= ('f8', 'f8', 'f8', 'i4', 'i4', 'i4' )

csv_data = np.genfromtxt(PATH_csv, dtype=csv_dtype, delimiter=',', names=True)

print (csv_data.dtype.names)
print (csv_data['posX'])

with h5py.File('SO_55576601.h5', 'w') as h5f:
    dset = h5f.create_dataset('CSV_data', data=csv_data)

h5f.close()   

Извините за задержку с ответом! Я попытался запустить этот код, используя большой CSV-файл размером 3,7 ГБ, но, к сожалению, по какой-то причине не хватило памяти (имея 16 ГБ в моей системе). Однако после использования большого CSV-файла ~ 800 МБ он сработал, как и предполагалось, даже после того, как я занял до ~ 8 ГБ ОЗУ, пока я запускал скрипт.

Yannick Borschneck 11.04.2019 17:31

В моем примере использовался ваш небольшой фрагмент данных в OP. Я не проводил тестирования памяти для больших наборов данных. На основании ваших результатов вам придется разбить данные CSV на отдельные файлы (с заголовками). Затем вы можете create_dataset() при первом чтении/записи, затем прочитать больше данных, изменить размер набора данных и записать больше данных. Примеры см. в этих сообщениях SO: инкрементная запись-в-hdf5-с-h5py и как добавить-данные-к-одному-конкретному-набору-данных-в-файле-hdf5-wi‌​th-h5py.

kcw78 11.04.2019 18:49

Другие вопросы по теме