ПК зависает при импорте данных из pandas dataframe в базу данных SQL с помощью to_sql - PullRequest
0 голосов
/ 13 июня 2018

Итак, в настоящее время я имею дело с большим объемом данных (62 файла, ~ 150 МБ каждый, ~ 3,5 миллиона строк каждый), и мне нужно загрузить эти плоские файлы в базу данных MySQL, поэтому я использовал библиотеку pandas для чтенияфайлы .csv и создать один фрейм данных, содержащий все данные.

О данных:

Данные разбиты на несколько файлов, так как каждый файл содержит информацию о конкретномместоположение (координаты) в разные дни.Например: один файл содержит данные для примерно 3,5 миллионов координат (они являются фиксированными и общими для всех файлов) в определенный день, и у меня есть 62 таких файла, то есть данные на 62 разных датах.
Я хочу просмотреть все эти данныев одну таблицу, т. е. я хочу добавить дополнительные столбцы (информация о различных датах, соответствующих списку местоположений) в таблицу, и общие столбцы (местоположения / координаты) должны появляться в этой таблице только один раз.Иллюстрация того, как я хочу, чтобы данные в таблице присутствовали здесь

До сих пор мой код выглядит так:

#relevant imports:
import os
import MySQLdb as sql
import numpy as np
from functools import reduce
from sqlalchemy import create_engine
import glob
import pandas as pd

#Accessing database:
engine = create_engine("mysql://root:PASSWORD@localhost/DBNAME")
con = engine.connect()

#Directory change:

path="C:\\Users\\DELL\\Desktop\\DataAnalysis-Internship 18'\\extracted data\\"
os.chdir(path)

#listing file names:
files=glob.glob("IN.201*.csv")
num_files=len(files)

#DATAFRAMES:
#initialiasing first dataframe:
df=pd.read_csv(path+files[0])
df.rename(columns={"avg":"avg"+str(0)}, inplace=True)

for file in files[1:]:
  i=1
  df_next=pd.read_csv(path+file)
  df_next.rename(columns={"avg":"avg"+str(i)}, inplace=True)
  df=df.merge(df_next, on=['lon','lat','country'])
  i=i+1

df.to_sql(con=con, name='final_table', if_exists='replace', chunksize=10000)

con.close() 

Когда я запускаю этот код, хотя,Мой компьютер начинает выполнять команду, и производительность постепенно снижается, и в итоге компьютер начинает зависать.Возможно, слишком много памяти используется, может быть, потому что я делаю один кадр данных из многих, а затем переношу его в базу данных (я не уверен).

Что мне теперь делать, чтобы загрузить все эти файлы вмой столик так, как я хочу?Есть ли более оптимизированный способ?Я думал о слиянии и создании таблиц из 5 файлов одновременно, а затем об использовании атрибута «if_exists = 'append'» в команде «to_sql» для объединения этих нескольких фреймов данных в одну таблицу вместо создания одного огромного фрейма данных и последующей его передачи, ноЯ не уверен насчет атрибута 'append' относительно того, присоединится ли он к таблицам так, как я хочу.

1 Ответ

0 голосов
/ 13 июня 2018

Я предполагаю, что проблема возникает с df = df.merge, возникающим в цикле

Никогда не вызывайте DataFrame.append или pd.concat внутри цикла for.Это приводит к квадратичному копированию.Источник: Почему конкатенация фреймов данных экспоненциально замедляется?

Попробуйте добавить все фреймы данных в список df_list, а затем объединить их один раз вконец:

import pandas as pd

df_list = []
df_list.append(pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6])))
df_list.append(pd.DataFrame(dict(c=[1, 2, 3], d=[4, 5, 6])))

pd.concat(df, axis=1)
Out[]:
   a  b  c  d
0  1  4  1  4
1  2  5  2  5
2  3  6  3  6
...