Python 如何通过pyodbc以编程方式清除MSSQL调用中的临时内存使用
我已经建立了一个连接到MSSQL的进程,运行一个SP,通过pandas收回其摘要输出,打印到屏幕,并通过电子邮件向我发送一份输出副本 这一切都如预期的那样工作,但在我运行它的最后两个晚上,我都注意到,进程的某些部分已经填满了我连接到的服务器上的tempdb 作为python脚本的一部分,我已经包含了一个关闭连接的请求,但是这种情况继续发生,这让我认为这是pyodbc或从python内部运行SQL的固有特性。SP本身并不特别需要内存(在SSMS中运行SP不会产生此类问题),因此这不是特定于SQL的问题 pyodbc是否有某种内存释放方法,或者是否有其他方法可以运行它而无需进行一些手动调整以避免填充tempdb 以下示例代码供参考:Python 如何通过pyodbc以编程方式清除MSSQL调用中的临时内存使用,python,sql,sql-server,python-3.6,pyodbc,Python,Sql,Sql Server,Python 3.6,Pyodbc,我已经建立了一个连接到MSSQL的进程,运行一个SP,通过pandas收回其摘要输出,打印到屏幕,并通过电子邮件向我发送一份输出副本 这一切都如预期的那样工作,但在我运行它的最后两个晚上,我都注意到,进程的某些部分已经填满了我连接到的服务器上的tempdb 作为python脚本的一部分,我已经包含了一个关闭连接的请求,但是这种情况继续发生,这让我认为这是pyodbc或从python内部运行SQL的固有特性。SP本身并不特别需要内存(在SSMS中运行SP不会产生此类问题),因此这不是特定于SQL的
import pyodbc
import pandas as pd
conn = pyodbc.connect('''
TRUSTED_CONNECTION=Yes;
DRIVER={SQL Server};
SERVER={myServer};
DATABASE=myDB;''')
r = pd.read_sql("exec [mySP]",conn)
print(r.to_string(index=False))
conn.close()
尝试从pyodbc连接运行一个查询,看看它是否给出相同的结果,您可以运行如下简单查询:
conn = pyodbc.connect("Driver={SQL Server};"
"Server=myServer;"
"Database=myDB;"
"Trusted_Connection=yes;")
cursor = conn.cursor()
cursor.execute('''
SELECT TOP 100 * FROM table.db WHERE COLUMN.2 = 'something' ''' )
for row in cursor:
# print(row[1:3])
row1 = row[2]
return row1
conn.close()
最近,我不得不找到一种方法来释放一个python程序在一个数据集中循环所积累的内存。我能够通过显式垃圾收集来减少每次迭代期间累积的内存量。然而,这还不够。我的最终解决方案是创建一个包装器,将python程序作为并行进程调用。因此,当程序完成时,该进程积累的内存将在进程退出时释放。如果这听起来有帮助,我很乐意写一个更详细的答案。请注意,默认情况下,pyodbc以
autocommit=False
(根据Python DB-API规范)的形式打开连接,因此您的整个SP可能在事务中运行。您可以尝试在通话中添加,autocommit=True
,看看是否有帮助。