Я использую Python 2.7 с пандами и HDFStore.
Я пытаюсь обработать большой набор данных, который помещается на диск, но не в память.
Я храню набор данных большого размера в файле .h5, размер данных в каждом столбце не является постоянным, например, один столбец может иметь строку из 5 символов в одной строке и строку из 20 символов в другой.
Поэтому у меня были проблемы с записью данных в файл в итерациях, когда первая итерация содержала небольшой размер данных, а следующие пакеты содержали данные большего размера.
Я обнаружил, что проблема заключалась в том, что min_size использовался неправильно, и данные не помещались в столбцы, я использовал следующий код для кэширования базы данных в h5 без ошибок.
colsLen = {}
for col in dbCols:
curs.execute('SELECT MAX(CHAR_LENGTH(%s)) FROM table' % col)
for a in curs:
colsLen.update({col: a[0]})
# get the first row to create the hdfstore
rx = dbConAndQuery.dbTableToDf(con, table, limit=1, offset=0) #this is my utility that is querying the db
hdf.put("table", table, format="table", data_columns=True, min_itemsize=colsLen)
for i in range(rxRowCount / batchSize + 1):
rx = dbConAndQuery.dbTableToDf(con, table, limit=batchSize, offset=i * batchSize + 1)
hdf.append("table", table, format="table", data_columns=True, min_itemsize=colsLen)
hdf.close()
Вопрос в следующем: как я могу использовать HDFStore в случаях, когда я не могу заранее запросить максимальный размер данных каждого столбца? например, получение или создание данных в итерациях из-за ограничений памяти.
Я обнаружил, что могу обрабатывать данные с помощью dask с фреймами данных на диске, но ему не хватает некоторых функций, которые мне нужны в pandas, поэтому основная идея состоит в том, чтобы обрабатывать данные партиями, добавляя их в существующий файл HDFStore.
Спасибо!