Я работаю с базой данных Oracle с миллионами строк и более 100 столбцов. Я пытаюсь сохранить эти данные в файле HDF5, используя pytables с индексированными столбцами. Я буду читать подмножества этих данных в pandas DataFrame и выполнять вычисления.
Я попытался сделать следующее:
Загрузите таблицу, используя утилиту в файл csv, прочитайте кусок файла csv с помощью chunk с помощью pandas и добавьте в таблицу HDF5 с помощью pandas.HDFStore
. Я создал определение dtype и предоставил максимальные размеры строк.
Однако теперь, когда я пытаюсь загрузить данные непосредственно из Oracle DB и отправить его в файл HDF5 через pandas.HDFStore
, я столкнулся с некоторыми проблемами.
pandas.io.sql.read_frame не поддерживает чтение каналов. У меня недостаточно памяти, чтобы сначала загрузить все данные в память.
Если я пытаюсь использовать cursor.fecthmany()
с фиксированным количеством записей, операция чтения занимает много времени в таблице БД, не индексируется, и мне приходится читать записи, подпадающие под диапазон дат. Я использую DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
однако созданный DataFrame всегда указывает тип dtype, а не навязывает dtype, который я предоставил (в отличие от read_csv, который придерживается dtype, который я предоставляю). Следовательно, когда я добавляю этот DataFrame к уже существующему HDFDatastore
, существует несоответствие типа, например. float64 может интерпретироваться как int64 в одном фрагменте.
Цените, если вы, ребята, можете предложить свои мысли и указать мне в правильном направлении.