访问数据库时python并行处理的内存消耗
我在SQL Server数据库中有一个相当大的表(1.8亿条记录)。如下所示:访问数据库时python并行处理的内存消耗,python,sql-server,memory,parallel-processing,Python,Sql Server,Memory,Parallel Processing,我在SQL Server数据库中有一个相当大的表(1.8亿条记录)。如下所示: my_table>> columns: Date, Value1, Value2, Valeu3 我还有一个python脚本,它与pool.map()并行运行,在每个子进程(迭代)中,都会建立一个连接来访问my_表,并使用下面的脚本获取其中的一部分,并进行其他计算: select * from my_table where Date is between a1 and a2 我的问题是,当python
my_table>> columns: Date, Value1, Value2, Valeu3
我还有一个python脚本,它与pool.map()
并行运行,在每个子进程(迭代)中,都会建立一个连接来访问my_表
,并使用下面的脚本获取其中的一部分,并进行其他计算:
select * from my_table where Date is between a1 and a2
我的问题是,当python脚本并行运行时,每个子进程是否会在内存中加载整个SQL表数据(1.8亿行),然后根据where条件对其进行切片
如果是这样的话,每个子进程必须将1.8亿行加载到内存中,这将冻结所有内容
我很确定,如果我在SQL Server中查询一个大表几次,第一次查询时SQL Server只会将整个数据加载到内存中一次,而其他查询将使用第一次查询时加载到RAM中的数据。在SQL Server查询中,总是从内存中的页面缓存读取数据。如果查询计划需要页缓存中当前未包含的页上的行,则缓冲区管理器会将查询放入PAGEIOLATCH等待并将页提取到内存中 如果多个进程发送一个查询,如
select * from my_table where Date is between a1 and a2
每个查询可能需要读取所有行以应用过滤器(这取决于索引),但它们都将从内存中读取相同的页面,直到表适合内存
通过使用(~3倍压缩)或(~10倍压缩)存储表,可以大幅增加表的内存容量
你可以用它来估计压缩
请注意,所有压缩样式都可以改进服务器端查询处理,但也会增加将行从服务器移动到客户端的成本,因为查询计划可以读取压缩数据,但必须解压缩才能通过网络发送。因此,如果你要把所有的东西都交给客户,这可能是不值得的
SQL Server 2017及更高版本还有一个可选组件,允许您在服务器上运行Python代码,并可以超快速访问数据