Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
访问数据库时python并行处理的内存消耗_Python_Sql Server_Memory_Parallel Processing - Fatal编程技术网

访问数据库时python并行处理的内存消耗

访问数据库时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

我在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脚本并行运行时,每个子进程是否会在内存中加载整个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代码,并可以超快速访问数据