У меня есть очень большой файл 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, а также изменение типа переменной каждого индекса.
Если что-то непонятно, прошу разъяснений. Я еще новичок!
Вы рассматривали модуль 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()
В моем примере использовался ваш небольшой фрагмент данных в OP. Я не проводил тестирования памяти для больших наборов данных. На основании ваших результатов вам придется разбить данные CSV на отдельные файлы (с заголовками). Затем вы можете create_dataset()
при первом чтении/записи, затем прочитать больше данных, изменить размер набора данных и записать больше данных. Примеры см. в этих сообщениях SO: инкрементная запись-в-hdf5-с-h5py и как добавить-данные-к-одному-конкретному-набору-данных-в-файле-hdf5-with-h5py.
Извините за задержку с ответом! Я попытался запустить этот код, используя большой CSV-файл размером 3,7 ГБ, но, к сожалению, по какой-то причине не хватило памяти (имея 16 ГБ в моей системе). Однако после использования большого CSV-файла ~ 800 МБ он сработал, как и предполагалось, даже после того, как я занял до ~ 8 ГБ ОЗУ, пока я запускал скрипт.