如何防止Python程序在SQL Server上使用过多内存



我有一个脚本,它扫描网络驱动器并找到csv文件,然后清理并输入到SQL数据库中。我使用一个python脚本将csv拉入pandas数据帧,然后将to_sql命令与使用64位ODBC连接的SQLAlchemy引擎对象一起使用。

这个程序是多线程的,所以每个包含csv文件的文件夹都会打开一个新的线程。一次可能有9个线程在运行,具体取决于它的运行时间。

我的问题是,这个程序在运行时会占用大量内存,而且一旦运行完毕,内存就不会减少。由于该脚本一天运行多次,因此RAM使用率最终会达到最大值,并降低服务器速度,即使查询速度通常非常快。

有没有什么方法可以优化我的程序,这样一旦程序运行完毕,内存就会减少?这是需要在SQL服务器上执行的操作吗?我只需要知道是哪个原因导致了这个问题。下面是我正在使用的代码示例。

其余的代码实际上只是清理数据,而且工作速度很快。最后一件事是每个csv插入的行数最多可达10000。该数据库目前有20亿行。我知道它有很多行,我也知道这会占用大量内存,但为什么在运行时内存会增加,一旦运行完毕就会保持在那里,然后在下一次运行时再增加?我有一个索引,它允许合理的查询快速提取,这些索引负责RAM的使用,但我不知道为什么它总是建立在自己的基础上。

以下是我正在使用的代码的基本内容。

engine=create_engine("mssql+pyodbc://Username:Password@DatabaseName")
def function(file_path):
csv_files = os.listdir(file_path)
for row in csv_files:
shot_df.to_sql(name='table_name', con = engine, 
if_exists='append', index=false)


for row in folders_with_csv_files:
file_path = row
t = threading.Thread(target=function, args=(file_path, ))
t.start()

如果线程真的完成了运行,那么它们应该被垃圾收集,内存就会减少。我猜测可能还有僵尸进程/线程仍然存在。

使用ps aux | grep <something that wouldidentify your process>或类似活动监视器的工具(按内存使用情况排序(可以帮助您找到并杀死它们。如果您共享创建线程的脚本的玩具版本,也许我们也可以了解这些线程没有完成的原因。

EDIT:在你包含了线程调用的方法之后,我认为问题是你打开了与数据库的连接,而没有关闭它们。您可以在使用这些连接后关闭它们。

最新更新