Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用pandas库将数据从MySQL迁移到SQL Server需要花费大量时间_Sql Server_Python 3.x_Pandas_Amazon Rds - Fatal编程技术网

Sql server 使用pandas库将数据从MySQL迁移到SQL Server需要花费大量时间

Sql server 使用pandas库将数据从MySQL迁移到SQL Server需要花费大量时间,sql-server,python-3.x,pandas,amazon-rds,Sql Server,Python 3.x,Pandas,Amazon Rds,我需要将所有历史数据从MySQL迁移到SQL server。数据大小超过50 GB 我创建了一个脚本,用于将这些数据从MySQL迁移到SQL server。使用python库。选择pandas库的主要原因是我在迁移之前添加了一些清理过程 def _insert_data_with_dataframe(self, df): if len(df) > 0: chunk_size = 5000 for i in range(len(df) // ch

我需要将所有历史数据从MySQL迁移到SQL server。数据大小超过50 GB

我创建了一个脚本,用于将这些数据从MySQL迁移到SQL server。使用python库。选择pandas库的主要原因是我在迁移之前添加了一些清理过程

def _insert_data_with_dataframe(self, df):

    if len(df) > 0:

        chunk_size = 5000

        for i in range(len(df) // chunk_size):
            df.head(n=chunk_size).to_sql('logs', self.engine_sql_staging, if_exists='append', index=False)

            df = df.iloc[chunk_size:]

            if len(logs) < chunk_size:
              logs.to_sql('logs', self.engine_sql_staging, if_exists='append', index=False)
              logs.iloc[chunk_size:]
def\u用数据帧插入数据(self,df):
如果len(df)>0:
块大小=5000
对于范围内的i(len(df)//块大小):
df.head(n=chunk\u size).to\u sql('logs',self.engine\u sql\u staging,如果存在='append',index=False)
df=df.iloc[块大小:]
如果len(logs)
我正在使用pandasdf.to_sql函数处理时间非常慢。为了优化这一点,我插入了这些数据块。但数据处理时间仍然很长

当我在本地机器上运行脚本时,处理100万行需要35分钟

当我在AWS服务器上运行时(我使用的是AWS SQL server RDS),只需50000行的时间超过半小时

我检查了AWS控制台,发现实例RAM和CPU正常。所以,我的问题是,在AWS服务器中,为什么对同一个查询花费太多时间


我的SQL server版本是2016年。

我确信如果您尝试以下操作,这将更快:

def _insert_data_with_dataframe(self, df):

    chunk_size = 5000

    df.to_sql('logs', self.engine_sql_staging, if_exists='append', index=False, chunksize=chunk_size)

请参阅关于to_sql:

的文档,我确信如果您尝试以下操作,这会更快:

def _insert_data_with_dataframe(self, df):

    chunk_size = 5000

    df.to_sql('logs', self.engine_sql_staging, if_exists='append', index=False, chunksize=chunk_size)

请参阅有关to_sql:

的文档,因为熊猫,这需要花费大量时间。Pandas不是一个ETL工具,它在尝试将所有内容逐行发送到目的地之前将其加载到内存中。直接连接要快得多SQL Server已经有了一个非常好的ETL工具SSIS。你为什么不用它?您甚至可以使用SSMS的导入数据向导将数据从MySQL或平面文件源传输到SQL Server目标。或者,您可以将数据上传到Amazon上的一个磁盘上,然后从那里加载数据,这取决于数据清理的类型,仅1百万行的35分钟可能太多了。插入50K行需要几秒钟,AWS与否。除非您试图将数据插入一个频繁使用的表中,否则会导致大量锁定。将数据加载到临时表中,然后运行单个MERGE或UPDATE/INSERT命令将数据移动到生产表中。批量导入工具,如SSIS、批量插入命令或
bcp
也对批量操作使用最少的日志记录。他们只记录整个数据页面,而不是记录单个插入,我也使用pentaho用于相同的目的,但得到了相同的结果。所以我认为熊猫在这里不是问题。用它做什么?如果您加载所有内容,然后一次只写一行,那么无论发生什么情况,您的性能都会很差。此外,为什么要使用任何东西呢?为什么不直接插入数据?或者上传一个flar文件,然后批量插入?因为熊猫的缘故,这需要很多时间。Pandas不是一个ETL工具,它在尝试将所有内容逐行发送到目的地之前将其加载到内存中。直接连接要快得多SQL Server已经有了一个非常好的ETL工具SSIS。你为什么不用它?您甚至可以使用SSMS的导入数据向导将数据从MySQL或平面文件源传输到SQL Server目标。或者,您可以将数据上传到Amazon上的一个磁盘上,然后从那里加载数据,这取决于数据清理的类型,仅1百万行的35分钟可能太多了。插入50K行需要几秒钟,AWS与否。除非您试图将数据插入一个频繁使用的表中,否则会导致大量锁定。将数据加载到临时表中,然后运行单个MERGE或UPDATE/INSERT命令将数据移动到生产表中。批量导入工具,如SSIS、批量插入命令或
bcp
也对批量操作使用最少的日志记录。他们只记录整个数据页面,而不是记录单个插入,我也使用pentaho用于相同的目的,但得到了相同的结果。所以我认为熊猫在这里不是问题。用它做什么?如果您加载所有内容,然后一次只写一行,那么无论发生什么情况,您的性能都会很差。此外,为什么要使用任何东西呢?为什么不直接插入数据?或者上传一个flar文件,然后批量插入?我使用了默认的chucksize参数,但仍然需要时间。是的,但应该是10分钟最长。。。至少当我使用它时,你使用的是哪种aws?我在中型计算机上,当我在小型计算机上时,我记得交换内存是一个问题。我正在使用中型计算机。最后一次尝试!;)你如何申报引擎?使用sql炼金术:导入sqlalchemy;engine=sqlalchemy。从sqlalchemy导入创建引擎创建引擎(数据库url);engine=create_engine('mssql+pymssql://'+连接+'/'+暂存_live)我使用了默认的chucksize参数,但它仍然需要时间。是的,但它最多应该是10分钟。。。至少当我使用它时,你使用的是哪种aws?我在中型计算机上,当我在小型计算机上时,我记得交换内存是一个问题。我正在使用中型计算机。最后一次尝试!;)你如何申报引擎?使用sql炼金术:导入sqlalchemy;engine=sqlalchemy。从sqlalchemy导入创建引擎创建引擎(数据库url);engine=create_engine('mssql+pymssql://'+连接+'/'+暂存_live)