python pandas HDFStore добавляет данные неконтрастного размера

Я использую 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.

Спасибо!


person thebeancounter    schedule 05.11.2017    source источник


Ответы (1)


Я обнаружил, что проблема заключалась в том, что hdf оптимизирует хранилище данных и рассчитывает размер наибольшего значения каждого столбца,

Я нашел два способа решить эту проблему: 1. Предварительно запросить базу данных, чтобы получить максимальную длину символа данных для каждого столбца. 2. Вставить каждый пакет в новый ключ в файле, после чего он работает, каждый пакет будет вставлен в файл hdf с помощью это самое большое значение как самое большое значение в столбце

person thebeancounter    schedule 14.12.2017