Python 基础 数据库复制时间:0:00:37.929166 总时间:0:01:53.217861 正在处理num_data_二进制文件的复制对象 复制0:00:01.296143中准备的对象;8000021字节;转移到数据库 数据库复制时间:0:00:23.325952 总时间:0:00:24.622095

Python 基础 数据库复制时间:0:00:37.929166 总时间:0:01:53.217861 正在处理num_data_二进制文件的复制对象 复制0:00:01.296143中准备的对象;8000021字节;转移到数据库 数据库复制时间:0:00:23.325952 总时间:0:00:24.622095,python,postgresql,bulkinsert,binary-data,psycopg2,Python,Postgresql,Bulkinsert,Binary Data,Psycopg2,所以,两个努比→ 文件和文件→ 使用二进制方法,数据库步骤要快得多。明显的区别在于Python如何准备拷贝文件,这对于文本来说非常慢。一般来说,二进制格式作为此模式的文本格式在2/3的时间内加载到数据库中 最后,我比较了数据库中两个表中的值,看看数字是否不同。对于s0列,大约1.46%的行具有不同的值,对于s6,这一比例增加到6.17%(可能与我使用的随机方法有关)。所有70M 32位浮点值之间的非零绝对差值范围在9.3132257e-010和7.6293945e-006之间。文本加载方法和二进

所以,两个努比→ 文件和文件→ 使用二进制方法,数据库步骤要快得多。明显的区别在于Python如何准备拷贝文件,这对于文本来说非常慢。一般来说,二进制格式作为此模式的文本格式在2/3的时间内加载到数据库中


最后,我比较了数据库中两个表中的值,看看数字是否不同。对于
s0
列,大约1.46%的行具有不同的值,对于
s6
,这一比例增加到6.17%(可能与我使用的随机方法有关)。所有70M 32位浮点值之间的非零绝对差值范围在9.3132257e-010和7.6293945e-006之间。文本加载方法和二进制加载方法之间的这些微小差异是由于浮点的精度损失造成的→ 正文→ 文本格式方法需要浮点转换。

当然可以,但是整个文件必须采用特定的二进制格式,而不仅仅是一个值。@Erwin,是的,我读过关于复制的二进制模式,但我不确定psycopg2是否支持它,或者我应该使用另一种方法。我使用的二进制文件格式的唯一应用是导入从PostgreSQL导出的文件。我不知道还有哪一个程序能写出这种特定的格式。但这并不意味着它不可能出现在某个地方。如果是重复操作,您可以将文本形式的文件复制到Postgres一次,写出二进制文件并从中复制。。下次格式化二进制文件。很酷。那是你自己写的,是从什么地方弄来的吗?它真的提高了性能吗?如果它有效,那就酷了!撇开格式不谈,解决方案是使用psycopg的
copy\u expert()
@Erwin,是的,我使用优秀的文档为和编程。基准测试已经存在,并且看起来不错。我为ruby创建了一个围绕这个的gem。大多数数据类型都受支持。这是我的版本。根据迈克的说法。它非常特别,但有两个优点:-除生成器外,还通过重载
readline
充当流-如何以
hstore
二进制格式编写示例。
CREATE TABLE num_data
(
  id serial PRIMARY KEY NOT NULL,
  node integer NOT NULL,
  ts smallint NOT NULL,
  val1 real,
  val2 double precision
);
CREATE TABLE num_data_binary
(
  id integer PRIMARY KEY,
  node integer NOT NULL,
  ts smallint NOT NULL,
  s0 real,
  s1 real,
  s2 real,
  s3 real,
  s4 real,
  s5 real,
  s6 real
) WITH (OIDS=FALSE);