pc在使用to\u sql将数据从pandas dataframe导入sql数据库时挂起

lztngnrs  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(375)

因此,我目前正在处理大量数据(62个文件,每个文件约150mb,每个文件约350万行),我需要将这些平面文件上载到mysql数据库,因此我使用pandas库读取.csv文件,并制作一个包含所有数据的Dataframe。
关于数据:
数据被分割成多个文件,因为每个文件都包含不同日期的特定位置(坐标)的信息。例如:一个文件包含某一天大约350万个坐标的数据(这些坐标是固定的,在所有文件中都是通用的),我有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()

当我运行这段代码时,我的电脑开始执行命令,性能慢慢下降,最终电脑开始挂起。可能太多的内存被占用了,可能是因为我正在用许多Dataframe制作一个Dataframe,然后将其传输到数据库(我不确定)。
我现在应该怎么做才能以我想要的方式将这些文件上传到我的表中?有没有更优化的方法?我想一次从5个文件合并并生成表,然后使用“to-sql”命令中的属性“if\u exists='append'”将这些多个Dataframe连接到一个表中,而不是生成一个巨大的Dataframe然后传输它,但是我不确定'append'属性是否会以我希望的方式连接表。

ppcbkaq5

ppcbkaq51#

我猜问题出在 df = df.merge 发生在循环中
从不打电话 DataFrame.append 或者 pd.concat 在for循环中。它导致二次复制。来源:为什么Dataframe的串联会以指数级的速度变慢?
尝试将所有Dataframe添加到列表中 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

相关问题