我在PostGIS中使用以下最近邻查询:
SELECT g1.gid g2.gid FROM points as g1, polygons g2
WHERE g1.gid <> g2.gid
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
LIMIT k;
Run Code Online (Sandbox Code Playgroud)
现在,我已经在两个表上的the_geom和gid列上创建了索引,这个查询所花费的时间比涉及空间连接的其他空间查询要多两个表.
有没有更好的方法找到K-最近邻居?我正在使用PostGIS.
而且,尽管在几何列上创建了索引,但另一个查询占用了异常长的时间:
select g1.gid , g2.gid from polygons as g1 , polygons as g2
where st_area(g1.the_geom) > st_area(g2.the_geom) ;
Run Code Online (Sandbox Code Playgroud)
我相信,这些查询并没有受到主要指标的影响,但为什么呢?
鉴于此查询:
select a.polyid , sum(length(b.the_geom)) from polygon as a , roads as b
where st_intersects(a.the_geom , b.the_geom);
Run Code Online (Sandbox Code Playgroud)
尽管涉及比"多边形"或"点"表大得多的"道路"表并且还涉及更复杂的空间算子,但是在一段时间之后返回结果.
我正在编写一个使用Python发送电子邮件的程序.我从各种论坛中学到的是以下代码:
#!/usr/bin/env python
import smtplib
sender = "sachinites@gmail.com"
receivers = ["abhisheks@cse.iitb.ac.in"]
yourname = "Abhishek Sagar"
recvname = "receptionist"
sub = "Testing email"
body = "who cares"
message = "From: " + yourname + "\n"
message = message + "To: " + recvname + "\n"
message = message + "Subject: " + sub + "\n"
message = message + body
try:
print "Sending email to " + recvname + "...",
server = smtplib.SMTP('smtp.gmail.com:587')
username = 'XYZ@gmail.com'
password = '*****'
server.ehlo()
server.starttls() …Run Code Online (Sandbox Code Playgroud) 这两个查询之间有什么区别:
select a.gid, sum(length(b.the_geom))
from polygons as a
, roads as b
where st_intersects(a.the_geom,b.the_geom)
group by a.gid ;
select a.gid, sum(length(b.the_geom))
from polygons as a
, roads as b
where st_overlaps(a.the_geom,b.the_geom)
group by a.gid ;
Run Code Online (Sandbox Code Playgroud)
第一个查询提供正确输出的位置,而第二个查询根本不检索任何行.与多边形相交的道路也与它重叠,对吧?
我正在尝试在 linux (ubuntu 14.04) 中添加我自己的自定义第 4 层协议 - IPPROTO_MYPROTO作为可加载内核模块。我已完成注册协议的所有必要步骤。我在这里分享我的代码。
当我尝试使用sendmsg()从用户空间程序发送消息时,我希望应该在内核空间中调用通过struct proto结构注册的相应 fn myproto_sendmsg() 。但我观察到的是,虽然内核空间中的myproto_sendmsg()没有被调用,但目标机器正在接收正确的数据。惊喜 !惊喜 !。默认的 udp sendmsg() fn 在这里启动,就像不速之客在做他的工作一样。
这里,用户空间中的 sendmsg() 调用返回与 send 一样多的字节。因此,fn 返回成功。
用户空间程序:
void forwardUDP( int destination_node ,char sendString[] )
{
struct msghdr msg;
destination_node = destination_node % N; //destination node to which data is to be forwaded
int sock, rc;
struct sockaddr_in server_addr;
struct iovec iov;
struct hostent *host; //hostent predefined structure use to …Run Code Online (Sandbox Code Playgroud) 是否可以在C中编写新的格式说明符?例如,假设%g是格式说明符,它以无符号整数等价物打印ABCD格式的ip地址.
int ip_addr = Some integer
printf("ip address = %g", ip_addr);
Run Code Online (Sandbox Code Playgroud)
输出:以ABCD格式打印ip地址
我试图理解为什么存在两种不同的协议系列来通过套接字操作内核路由表。任何人都可以帮助理解我两种类型的套接字之间有什么区别吗?看起来两者都有相同的目的 - 操作内核路由表,但是程序员决定是否使用AF_ROUTE或AF_NETLINK (NETLINK_ROUTE)套接字的标准是什么?
创建两个套接字类型:
sockfd = 套接字(AF_ROUTE,SOCK_RAW,0);
sockfd = 套接字(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE);
我试图初始化数组,如下所示:
static tha_field_info_t person_t_fields[] = {
HA_FIELD_INFO(person_t, name, CHAR)
};
Run Code Online (Sandbox Code Playgroud)
相关数据结构:
typedef struct _tha_field_info_{
char fname[128];
DATA_TYPE_t dtype;
unsigned int size;
unsigned int offset;
} tha_field_info_t;
typedef struct _person{
char name[30];
unsigned int age;
} person_t;
Run Code Online (Sandbox Code Playgroud)
使用的宏
#define HA_FIELD_OFFSET(st, name) ((int)&((st *)0)->name)
#define HA_FIELD_SIZE(st, name) sizeof (((st *)0)->name)
#define HA_FIELD_INFO (st, fname, dtype) \
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}
Run Code Online (Sandbox Code Playgroud)
使用此宏看到编译错误。
tha.h:35:28: error: ‘fname’ undeclared (first use in this function)
tha.h:35:35: error: ‘dtype’ undeclared (first use in this function)
tha.h:36:2: …Run Code Online (Sandbox Code Playgroud) 如何无符号的字符,例如,从取值-128到+127?根据我的理解,最重要的位用于表示数字的符号,而字符的剩余位用于表示数字的大小.现在,7位的最大可能幅度是127,所以范围不应该从?-127到+127?怎样才能-128有一个结果?
其次,以下行为背后的位级逻辑是什么
#include <stdio.h>
int main()
{
signed char x = 127;
x += 1;
printf("%i", x);
}
Run Code Online (Sandbox Code Playgroud)
输出:
-128
Run Code Online (Sandbox Code Playgroud)
人们可以看到,x成为-128,但为什么呢?这种行为背后的算法是什么?
ret = listen(connection_socket, 1); //允许队列中有一个连接
我打开了 2 个终端并同时在所有 2 个终端中运行客户端进程。
这里服务器正忙于处理客户端 1 的数据,现在客户端 2 处于待处理队列中。现在队列已满。
在这个阶段,我已经启动了第三个终端并运行了客户端进程。正弦队列已满,此客户端的 connect 应返回 -1 并且 errno 应设置为 ECONNREFUSED,但在这种情况下,connect 也为客户端 3 返回 0。那么listen()系统调用的目的是什么。
据我了解,SOCK_DGRAM 和 SOCK_STREAM 对应于使用 INET 地址族完成的无连接和面向连接的网络通信。
现在我正在尝试学习 AF_UNIX 套接字以在同一主机上运行的进程之间执行 IPC,并且我发现我们需要将 sub_socket_type 指定为 SOCK_DGRAM 或 SOCK_STREAM。我无法理解 AF_UNIX 套接字指定子套接字类型的目的是什么。
任何人都可以帮助理解 AF_UNIX 套接字上下文中 SOCK_DGRAM 和 SOCK_STREAM 的意义吗?
我已经开始pgpool使用命令
sudo pgpool -n &
Run Code Online (Sandbox Code Playgroud)
它开始在终端上给出以下消息:
2012-05-04 10:54:29 日志:pid 4109:pgpool-II 成功启动。版本 2.3.2.1 (tomiteboshi)
但是当我尝试运行以下命令时:
createdb -p 9999 bench_replication
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
createdb:无法连接到数据库 postgres:无法连接到服务器:没有这样的文件或目录。服务器是否在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.9999”上的连接?
当我将端口从 9999 更改为 5432 时,bench_replication只会在本地节点上创建数据库,而不会在从节点上创建数据库。但是,教程说要在此命令中提及端口 9999,以便bench_replication通过pgpool.
为了确认是否pgpool真的在运行,我停止pgpool使用命令
2012-05-04 10:58:50 LOG: pid 4109: received smart shutdown request
stop request sent to pgpool. waiting for termination...done.
[1]+ Done sudo -A pgpool -n
Run Code Online (Sandbox Code Playgroud)
这证实了pgpool实际上正在运行。我究竟做错了什么?我已经更改pgpool了网络上标准教程中提到的所有配置文件。