因此,我目前正在处理大量数据(62个文件,每个〜150mb,每个〜350万行),我需要将这些平面文件上传到MySQL数据库,因此我使用了pandas库来读取.csv文件,并制作一个包含所有数据的数据框。
关于数据:
数据分为多个文件,因为每个文件都包含有关不同日期的特定位置(坐标)的信息。例如:一个文件包含特定日期的约350万个坐标的数据(这些是固定的,并且在所有文件中都是公用的),而我有62个此类文件,它们表示62个不同日期的数据。
我想在一个表中查看所有这些数据,即,我想在表中添加额外的列(与位置列表相对应的不同日期的信息),而常见的列(位置/坐标)应该只出现一次在此表中。我要如何在表中显示数据的说明here
到目前为止,我的代码如下所示:
#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()
但是,当我运行此代码时,我的PC开始执行命令,并且性能缓慢下降,最终PC开始挂起。可能正在用完太多内存,可能是因为我要从多个内存中制作一个数据帧,然后将其传输到数据库中(我不确定)。
现在我应该怎么做才能将所有这些文件上传到我的表中?有没有更优化的方法?我想到了一次合并并从5个文件制作表,然后在'to_sql'命令中使用属性“ if_exists ='append'”将这些多个数据框合并到一个表中,而不是制作一个巨大的数据框然后进行传输,但是我不确定'append'属性是否会以我想要的方式加入表格。
最佳答案
我的猜测是问题出在循环中df = df.merge
切勿在for循环内调用DataFrame.append
或pd.concat
。这导致二次复制。资料来源:Why does concatenation of DataFrames get exponentially slower?
尝试将所有数据框添加到列表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
关于python - 使用to_sql将 Pandas 数据框中的数据导入SQL数据库时,PC挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50836908/