python postgresql通过网络复制到/从压缩流

时间:2018-09-10 01:11:52

标签: python postgresql

我正在通过Linux Deploy在运行Ubuntu 18.04的多个Android平板电脑上设置一系列postgresql 10服务器。我想从本地服务器向远程服务器发送完整的参考表。然后,我将使用多种记录链接算法将要加入的另一个表的碎片发送到参考表。最后,来自每个服务器的结果将被发送回本地服务器。我查看的各种MPP软件无法满足我的要求,特别是考虑到我要使用的连接范围广泛。

最大的挑战与带宽有关。所有平板电脑都通过Wifi连接,这很慢。而且,平板电脑的存储空间有限,无法扩展。因此,将压缩数据直接发送到远程服务器以及直接发送回本地服务器将非常有帮助。

我认为我得到的最接近的数据是使用Aryeh Leib Taurog的answer here将数据从psycopg2的COPY命令传送到管道。但这当然不是压缩数据。

我使用该管道方法的代码如下。是否可以在本地压缩流并让远程计算机使用其CPU来解压缩流? postgresql社区正在致力于网络压缩,但尚未发布。我不希望使用SSL,这是我认为在服务器中可用的唯一压缩方式。

fromdb = psycopg2.connect("dbname=postgres user=postgres")
todb = psycopg2.connect(f"host={node['host_ip']} dbname=postgres user=postgres")

r_fd, w_fd = os.pipe()

def copy_from():
    cur = todb.cursor()
    cur.copy_expert(f"COPY {table_name} FROM STDIN WITH CSV HEADER", os.fdopen(r_fd))
    cur.close()
    todb.commit()

to_thread = threading.Thread(target=copy_from)
to_thread.start()

copy_to_stmt = (f"COPY (SELECT * FROM {table_name} LIMIT {limit} OFFSET {offset}) TO STDOUT WITH CSV HEADER")

cur = fromdb.cursor()
write_f = os.fdopen(w_fd, 'w')
cur.copy_expert(copy_to_stmt, write_f)
write_f.close()

to_thread.join()
fromdb.close()
todb.close()

现在,我的Python代码在本地计算机上创建了zip文件。然后,它使用paramiko通过sftp传输文件,并在远程服务器上运行psql COPY FROM PROGRAM'zcat filename.zip'命令。但这以多种方式减慢了速度,包括必须先生成并传输zip文件,然后才能将其导入。在导入过程中,它还占用了远程计算机存储空间的两倍。

我正在编写的脚本在本地服务器上运行,但是我不反对让它与远程服务器上的Python代码进行交互。远程计算机也可以设置为dispy节点(如果有帮助的话),但是我需要远程运行的作业都是针对每台计算机的,这使dispy的用处不大。

值得注意的是,此设置不能很好地与网络共享配合使用。但是,可能愿意使用远程计算机可以访问的本地FTP服务器。本地计算机是Windows,但是我愿意使用Ubuntu虚拟机。

有什么想法吗?

0 个答案:

没有答案