Попытка уменьшить размер файла HDF5 путем изменения типов полей индекса с помощью h5py - PullRequest
1 голос
/ 08 апреля 2019

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

PosX, Пози, posZ, с кодом события, 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")

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

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

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

1 Ответ

1 голос
/ 08 апреля 2019

Рассматривали ли вы модуль 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()   
...