У меня есть сервер оракула, с которого мне нужно извлечь данные, используя python в файлы. Эти файлы используются нижестоящими системами в качестве входных данных.
Несколько технических деталей:
Oracle и Python работают на разных серверах. База данных размещается на клиенте, а все сценарии выполняются на сервере AWS RHEL EC2. Детали экземпляра EC2 выделены на этом снимке экрана.
.
Мой подход
Для этого я выбираю Python-библиотеку Python для подключения к удаленному клиенту Oracle и извлечения данных с помощью SQL-запроса. Ниже приведен фрагмент кода, который извлекает данные на основе предоставленного SQL-запроса.
def fetch_data_to_file(self,curr,query,dataset):
try:
self.logger.info('Executing query: {}'.format(query))
start = time.time()
curr.execute(query)
query_time = time.time()-start
start = time.time()
rowcount=0
with open(dataset,'a+') as f:
writer = csv.writer(f,delimiter='|')
writer.writerow([i[0] for i in curr.description])
self.logger.info('Writing file: {}'.format(dataset))
while True:
rows = curr.fetchmany(self.batch_limit)
self.logger.info('Writing {} rows'.format(self.batch_limit))
rowcount+=len(rows)
if not rows:
break
self.timer.info('{} Query Execution Time: {} seconds'.format(dataset,query_time))
self.timer.info('{} File Writing Time: {} seconds. at {} rows/second'.format(dataset,time.time()-start,int(rowcount / (time.time()-start))))
self.logger.info("File written.")
except Exception as e:
self.error.info("Error in fetching data.Error: {}".format(e))
raise SystemExit(1)
Набор данных, который я извлекаю, близок к несжатому размеру 8 ГБ (возвращено около 35 миллионов строк). И для загрузки файла на мой сервер EC2 требуется примерно 1,5 часа.
Я протестировал несколько вариантов batch_limits и обнаружил, что 1Million - 2Million - оптимальный размер для пакетной загрузки данных, однако я не уверен, есть ли что-то еще, что я могу сделать более эффективно, чтобы выяснить, каким должен быть мой размер пакета.
Что еще я изучил
Я искал в Интернете, чтобы выяснить способы записи больших наборов данных в файлы с использованием Python, и многие предлагали использовать Pandas. Я пытался понять это, но не смог. Кроме того, важно, чтобы я сохранил данные и их типы данных, извлекая их в файлы.
Мой вопрос здесь : могу ли я сделать что-нибудь лучше, чтобы сделать этот код более эффективным? Является ли Python лучшим языком для этого? (Обратите внимание, мне нужно иметь возможность автоматизировать работу на любом языке, который я выберу. На данный момент поиск лицензированных библиотек немного затруднителен из-за внутренних ценовых проблем в моей фирме).
Кроме того, не уверен, поможет ли это, но вот снимок использования моей памяти, пока код загружал данные (htop)
![enter image description here](https://i.stack.imgur.com/7dD1y.jpg)