Python 3.2引入了Concurrent Futures,它似乎是旧版线程和多处理模块的一些高级组合.
与旧的多处理模块相比,在CPU绑定任务中使用它有什么优缺点?
这篇文章表明他们更容易合作 - 是这样吗?
我有一个项目,需要偶尔从六个不同大小的表之一删除几万行,但它们之间有大约3000万行.由于我已经给出了数据的结构,我不知道六个表中哪一个有需要删除的行,所以我必须对所有表运行所有删除.我已经针对ID列构建了一个INDEX来尝试加快速度,但是如果它能加快速度的话就可以删除它.
我的问题是,我似乎无法找到实际执行删除的有效方法.出于测试的目的,我在单个测试表上运行7384个删除行,该测试表有大约9400行.我在Oracle SQL Developer中测试了许多可能的查询解决方案:
7384个单独的DELETE陈述耗时203秒:
delete from TABLE1 where ID=1000001356443294;
delete from TABLE1 where ID=1000001356443296;
etc...
Run Code Online (Sandbox Code Playgroud)
7384个单独的SELECT陈述花了57秒:
select ID from TABLE1 where ID=1000001356443294
select ID from TABLE1 where ID=1000001356443296
etc...
Run Code Online (Sandbox Code Playgroud)
7384个单独的DELETE from (SELECT)陈述耗时214秒:
delete from (select ID from TABLE1 where ID=1000001356443294);
delete from (select ID from TABLE1 where ID=1000001356443296);
etc...
Run Code Online (Sandbox Code Playgroud)
1个SELECT声明中有7384个OR条款,其中127.4s:
select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or …Run Code Online (Sandbox Code Playgroud) 我有空间数据,Oracle已分配SRID为81989.我想将它改为27700 - 它们都是相同的坐标系,它只是Oracle使用自己的SRID; 所以不需要重新投影(因为SDO_CS.TRANSFORM它不起作用,因为它实际上也改变了坐标,这是我不想要的)).
我已经USER_SDO_GEOM_METADATA足够轻松地更新了,但是SDO_GEOMETRY包含数据本身也有SRID,我不知道如何更改它.
例如,我的当前数据如下:
MDSYS.SDO_GEOMETRY(2001,81989,MDSYS.SDO_POINT_TYPE(420531.663898,268911.956161,NULL),NULL,NULL)
Run Code Online (Sandbox Code Playgroud)
我需要把它改成:
MDSYS.SDO_GEOMETRY(2001,27700,MDSYS.SDO_POINT_TYPE(420531.663898,268911.956161,NULL),NULL,NULL)
Run Code Online (Sandbox Code Playgroud)
对于表中的所有行.但我不知道如何自动更改SDO_GEOMETRY中的单个元素,同时保持数组的其他方面不变.
任何人都能指出我的方向吗?谢谢.
我想使用concurrent.futures模块启用程序的并行处理/线程.
不幸的是,我似乎无法找到使用concurrent.futures模块的任何好的,简单的,笨拙的例子.它们通常需要更高级的python知识或处理/线程概念和术语.
下面是一个基于我的程序的简化的自包含示例:有一个纯粹的CPU绑定任务,适用于多路径,以及插入数据库(SQLite)的单独IO绑定任务.在我的程序中,我已经将其转换为使用多处理池类,但由于CPU绑定任务的结果都被收集起来等待任务完成,因此它使用了大量内存.因此,我希望使用线程/处理的组合,我相信concurrent.futures可以相当简单地为我做.
那么如何将以下内容转换为使用此模块的内容?
import sqlite3
#Stand in CPU intensive task
def calculate(value):
return value * 10
#Stand in Thread I/O intensive task
def output(value):
global db
if (value % 1000) == 0:
db.execute('delete from test_table')
db.execute('insert into test_table (result) values (?)', (value,))
def main():
global db
results = []
db = sqlite3.connect('e:\\z_dev\\test.sqlite')
db.cursor()
#=========
#Perform CPU intensive task
for i in range(1000):
results.append( calculate(i))
#Perform Threading intensive task
for a in results:
output(a)
#=========
db.commit()
db.close()
if …Run Code Online (Sandbox Code Playgroud) 我有一个相当标准的SQL查询,如下所示:
TRUNCATE TABLE TABLE_NAME;
INSERT INTO TABLE_NAME
(
UPRN,
SAO_START_NUMBER,
SAO_START_SUFFIX,
SAO_END_NUMBER,
SAO_END_SUFFIX,
SAO_TEXT,
PAO_START_NUMBER,
PAO_START_SUFFIX,
PAO_END_NUMBER,
PAO_END_SUFFIX,
PAO_TEXT,
STREET_DESCRIPTOR,
TOWN_NAME,
POSTCODE,
XY_COORD,
EASTING,
NORTHING,
ADDRESS
)
SELECT
BASIC_LAND_AND_PROPERTY_UNIT.UPRN,
LAND_AND_PROPERTY_IDENTIFIER.SAO_START_NUMBER AS SAO_START_NUMBER,
LAND_AND_PROPERTY_IDENTIFIER.SAO_START_SUFFIX AS SAO_START_SUFFIX,
LAND_AND_PROPERTY_IDENTIFIER.SAO_END_NUMBER AS SAO_END_NUMBER,
LAND_AND_PROPERTY_IDENTIFIER.SAO_END_SUFFIX AS SAO_END_SUFFIX,
LAND_AND_PROPERTY_IDENTIFIER.SAO_TEXT AS SAO_TEXT,
LAND_AND_PROPERTY_IDENTIFIER.PAO_START_NUMBER AS PAO_START_NUMBER,
LAND_AND_PROPERTY_IDENTIFIER.PAO_START_SUFFIX AS PAO_START_SUFFIX,
LAND_AND_PROPERTY_IDENTIFIER.PAO_END_NUMBER AS PAO_END_NUMBER,
LAND_AND_PROPERTY_IDENTIFIER.PAO_END_SUFFIX AS PAO_END_SUFFIX,
LAND_AND_PROPERTY_IDENTIFIER.PAO_TEXT AS PAO_TEXT,
STREET_DESCRIPTOR.STREET_DESCRIPTOR AS STREET_DESCRIPTOR,
STREET_DESCRIPTOR.TOWN_NAME AS TOWN_NAME,
LAND_AND_PROPERTY_IDENTIFIER.POSTCODE AS POSTCODE,
BASIC_LAND_AND_PROPERTY_UNIT.GEOMETRY AS XY_COORD,
BASIC_LAND_AND_PROPERTY_UNIT.X_COORDINATE AS EASTING,
BASIC_LAND_AND_PROPERTY_UNIT.Y_COORDINATE AS NORTHING,
decode(SAO_START_NUMBER,null,null,SAO_START_NUMBER||SAO_START_SUFFIX||' ')
||decode(SAO_END_NUMBER,null,null,SAO_END_NUMBER||SAO_END_SUFFIX||' …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Python 中创建一个包,它有许多需要互操作的子包(我不确定这对它们来说是否正确)。
我有一个这样的(简化的)结构:
/package
|-script1.py
|-script2.py
|-subpackage1
| |-__init__.py
| |-src
| | |-__init__.py
| | |-my_program.py
| | |-functions.py
| | |-...
|
|-tests
| |-a_tests.py
|-subpackage2
| |-web-server.py
| |-API
| | |-__init__.py
| | |-REST.py
| | |-...
Run Code Online (Sandbox Code Playgroud)
package/subpackage2 需要能够调用 package/subpackage1/src/functions.pypackage/tests调用两个子包(使用pytests)。package/subpackage1/src/functions.py 需要能够调用内部的其他模块 subpackage1我已经看到了这个答案:https : //stackoverflow.com/a/33195094 - 它解释了我需要做什么(创建一个包),但它没有解释如何去做。
我可以很容易地让两者scripts使用以下方法调用它们的组件子包:
import subpackage1.src.my_program.py
(即类似于此处的建议)但随后my_program.py失败并显示ImportError: No module named 'functions'
那么,我需要什么胶水来设置这个结构?
我正在处理数千个 XML 文件,并希望使用ProcessPoolExecutorfrom来完成此操作concurrent.futures。
唯一的文档示例假设您在继续之前等待所有结果(就像我找到的所有并发.futures 教程一样),但在这种情况下这是不可行的,因为我将在处理完成之前耗尽 RAM。
一种选择是使用类似这样的东西来批量工作 - http://grokbase.com/t/python/python-list/1458ss5etz/real-world-use-of-concurrent-futures#20140508uqijcqm5ddbvxhq4xpkqaw3ebi,我已经使用之前项目中的方法。
但我认为更好的选择是将处理结果(dict各种数据)发送到单独的(单个)后处理过程。在这种情况下,后处理需要将结果写入 SQLite 数据库文件,但如果它可以是一个单独的专用进程,它将对该文件具有独占控制权,从而消除死锁、文件损坏等风险。
我知道根据这个优秀的答案,使用队列进行多重处理是可能的 - Python 多重处理安全地写入文件- 这可以通过并发.futures 来完成吗?如果可以,如何实现?
(我使用的是Python 3.6)
我们有一个表,其中有两次相同的数据插入其中意味着大多数(但不是所有)行在表中出现两次.简单地说,我想要一个SQL语句删除一行的一个版本,同时保留另一个版本; 我不介意删除哪个版本,因为它们是相同的.
表结构类似于:
FID,unique_ID,COL3,COL4 ....
Unique_ID是主键,意味着每个键只出现一次.
FID是每个功能唯一的密钥,因此如果它出现多次,则应删除重复项.
要选择具有重复项的功能,请执行以下操作:
select count(*) from TABLE GROUP by FID
不幸的是,我无法弄清楚如何从那里删除将删除多余行的SQL删除语句,只留下其中一行.
之前已经问过这类问题,我尝试了不同的创建表,但如何在不命名的情况下获取所有列?这只获取单列FID并将列出的所有列保持为:ORA-00936: missing expression
CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE
继浏览器中的Max并行http连接之后?,浏览器每个主机只能有几个连接.我知道这可以解决使用子域的问题,但是我可以通过为同一主机使用不同的端口来解决这个问题吗?
那么下面是否允许浏览器将其连接三倍(假设某些内容正在侦听每个端口)?
www.example.com
www.example.com:8080
www.example.com:8081
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在做一些文件解析,这是一个CPU绑定任务.无论我在这个过程中抛出多少文件,它都使用不超过大约50MB的RAM.该任务是可并行的,我已将其设置为使用下面的并发期货来解析每个文件作为一个单独的过程:
from concurrent import futures
with futures.ProcessPoolExecutor(max_workers=6) as executor:
# A dictionary which will contain a list the future info in the key, and the filename in the value
jobs = {}
# Loop through the files, and run the parse function for each file, sending the file-name to it.
# The results of can come back in any order.
for this_file in files_list:
job = executor.submit(parse_function, this_file, **parser_variables)
jobs[job] = this_file
# Get the completed jobs whenever they are …Run Code Online (Sandbox Code Playgroud) 我正在使用 OpenAPI 3 并有两个查询参数,其中至少一个是必需的,但哪个无关紧要。
即,作为sudocode:
if parameter_1 OR parameter_2:
do stuff
else:
error
Run Code Online (Sandbox Code Playgroud)
这在 OpenAPI 3 中可能吗?就我所见,规范或 JSON Schema 规范中都没有提及它。
我正在使用Jetty 8并正在配置我的jetty.xml来自定义requests.log文件.
我的问题是,Jetty在GMT时区提供时间戳的日志 - 我在英国,但现在是夏天时间(GMT + 1,又名BST).可能是因为:
<Set name="LogTimeZone">GMT</Set>
Run Code Online (Sandbox Code Playgroud)
如何让Jetty使用服务器上的本地时间来提供日志(这是正确的)?简单地删除<Set name="LogTimeZone">GMT</Set>没有做任何事情,我不想每6个月手动更改一次.
谢谢
我想使用 sqlite 写入多个表,但我不想提前手动指定查询(有数十种可能的排列)。
例如:
def insert_sqlite(tablename, data_list)
global dbc
dbc.execute("insert into " + tablename + " values (?)", data_list)
tables_and_data = {
'numbers_table': [1,2,3,4,5],
'text_table': ["pies","cakes"]
}
for key in tables_and_data:
insert_sqlite(key, tables_and_data[key])
Run Code Online (Sandbox Code Playgroud)
我希望发生两件事:
a)tablename动态设置 - 我还没有找到一个这样做的例子。
b)data_list正确使用的值 - 请注意列表的长度有所不同(根据示例)。
但上面的方法不起作用 - 如何动态创建 sqlite3.execute 语句?
谢谢