- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚做了一个时间测试,从 csv 加载一个数据数组,在 Postgres 上创建一个数据库,然后用 python 和 R 将表写入它。
我很惊讶,时间非常相似:
首先是 python 代码:(例如)
import timeit
tic = timeit.default_timer()
tic4 = timeit.default_timer()
import xlrd as xl
import psycopg2 as pq
import os
import pandas as pd
import numpy as np
import csv
from pprint import pprint as pp
perf_dir = '/myhomedir'
toc4=timeit.default_timer()
# Create the database
tic1= timeit.default_timer()
os.system('dropdb ptest')
os.system('createdb ptest')
# connect to the database
cn = pq.connect('dbname=ptest user=me')
cr = cn.cursor()
toc1=timeit.default_timer()
# Create the tables:
### load csvs
tic2=timeit.default_timer()
id_files = ('di1','di2','di.c')
id_files = [i+r'.csv' for i in id_files]
id1 = csv.reader(open(os.path.join(perf_dir,id_files[0])),delimiter='\t')
id1 = [i for i in id1]
id2 = csv.reader(open(os.path.join(perf_dir,id_files[1])))
id2 = [i for i in id2]
id3 = csv.reader(open(os.path.join(perf_dir,id_files[2])),delimiter='\t')
id3 = [i for i in id3]
id3 = [i[1:3] for i in id3]
toc2=timeit.default_timer()
# create tables and fill
### id1 fund classifications
tic3=timeit.default_timer()
cr.execute('CREATE TABLE id1 (%s varchar, %s int PRIMARY KEY, %s int, %s int, %s varchar)' % tuple(id1[0]))
FLDS = 'INSERT INTO id1 (%s,%s,%s,%s,%s) VALUES' % tuple(id1[0])
SQL = FLDS + ' (%s,%s,%s,%s,%s)'
for i in range(1,len(id1)):
data = tuple(id1[i])
cr.execute(SQL,data)
### id2 portfolio group classifications - reference only
cr.execute('CREATE TABLE id2 (%s varchar, %s int PRIMARY KEY, %s int)' % tuple(id2[0]))
SQL = 'INSERT INTO id2 (%s,%s,%s) VALUES' % tuple(id2[0]) + ' (%s,%s,%s)'
for i in range(1,len(id2)):
data = tuple(id2[i])
cr.execute(SQL,data)
### id3 value variable classifications
cr.execute('CREATE TABLE id3 (%s varchar,%s varchar)' % tuple(id3[0]))
SQL = 'INSERT INTO id3 VALUES(%s,%s)'
for i in range(1,len(id3)):
data = tuple(id3[i])
cr.execute(SQL,data)
cn.commit()
# Timing block - will be commented out in final code
toc3=timeit.default_timer()
toc = timeit.default_timer()
time = (toc - tic)
time1 = toc1 - tic1
time2 = toc2 - tic2
time3 = toc3 - tic3
time4 = toc4 - tic4
print('Overall time: %s' % time)
print('dB create & connect time: %s' % time1)
print('Load id csvs time: %s' % time2)
print('Create tables and write to db time: %s' % time3)
print('Time to import libraries: %s' % time4)
和 R 代码(更清晰)
tic = proc.time()
library(RPostgreSQL)
tic1 = proc.time()
system('dropdb ptest1')
system('createdb ptest1')
drv = dbDriver("PostgreSQL")
con = dbConnect(drv, dbname='ptest1')
toc1 = proc.time()
time1 = toc1 - tic1
tic2 = proc.time()
id.1 = read.csv('/myhomedir/di1.csv',stringsAsFactors=F,sep='\t')
id.2 = read.csv('/myhomedir/di2.csv',stringsAsFactors=F)
id.3 = read.csv('/myhomedir/di.c.csv',stringsAsFactors=F,sep='\t')
id.3 = id.3[,-1]
toc2 = proc.time()
time2 = toc2 - tic2
tic3 = proc.time()
dbWriteTable(con,'id1',id.1)
dbWriteTable(con,'id2',id.2)
dbWriteTable(con,'id3',id.3)
toc3 = proc.time()
time3 = toc3 - tic3
toc = proc.time()
time = toc - tic
tyme = rbind(time1,time2,time3,time)
tyme = data.frame(Function=c('Create & Connect to DB',"Load CSV's for save","Write Table to DB",'Overall Time'),tyme)
我很惊讶两人的时间如此接近。 (我读过很多关于 R 很慢而 Python 非常快的文章)
对于 python
>>> Overall time: 2.48381304741
dB create & connect time: 1.96832108498
Load id csvs time: 0.000378847122192
Create tables and write to db time: 0.35303401947
Time to import libraries: 0.162075042725
对于 R
Function user.self sys.self elapsed user.child sys.child
time1 Create & Connect to DB 0.112 0.016 1.943 0.06 0.004
time2 Load CSV's for save 0.008 0.000 0.006 0.00 0.000
time3 Write Table to DB 0.096 0.004 0.349 0.00 0.000
time Overall Time 0.376 0.028 2.463 0.06 0.004
我想知道这是否与我一次INSERT
将一行插入到表的 python 版本中这一事实有关。
因此出现了主要问题 - R 代码中的 dbWriteTable
block 在 python 中是否有等效项,它会加快处理速度吗?
第二个附属问题是代码是否有任何明显的错误可能会减慢速度。
如果有帮助,很乐意提供样本 csv。
不想在 R 与 Python 之间展开激烈的 war ,只是想知道如何让我的代码更快。
谢谢
最佳答案
试试这个:
id2 = csv.reader(open(os.path.join(perf_dir,id_files[1])))
h = tuple(next(id2))
create = '''CREATE TABLE id2 (%s varchar, %s int PRIMARY KEY, %s int)''' % h
insert = '''INSERT INTO id2 (%s, %s, %s) VALUES (%%s, %%s, %%s)''' % h
...
cr.executemany(insert, id2)
对所有行只传递一次 sql 命令。除了发出额外的 sql 命令的性能开销之外,请注意 sql 字符串本身的大小(以字节为单位)可能使被测真实数据的大小相形见绌。
在没有数组的情况下使用 id2 作为生成器也应该避免将整个数据集加载到内存中。
关于python - psycopg2 相当于 R dbWriteTable 命令并从 python 代码获得更多性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159841/
如何使用 dbWriteTable 将带有日期列的数据框写入 Oracle 数据库?我在尝试: df <-read.table(header = TRUE, sep = ',', stringsAsF
我成功连接到 MYSQL 数据库并尝试将我的结果写回数据库:dbWriteTable(con,"predicted min",forecast$min) 其中 forecast$min 只是一个 do
从 MS Access 数据库导入的大型数据集,然后按日期对数据进行子集并导出到 SQL 数据库。 通过 sqlsave 命令导出工作正常,但是由于数据集的大小(超过 500,000 行,包含 73
我有一个 80 * 5 data.frame df 使用 dbWriteTable(mydb, name = "fooDB", df, field.types = dbtypes, row.names
我有一个 R 例程,需要将来自第三方的文本写入 MySQL 数据库。该文本通常包含换行符。 不幸的是, foobar <- as.data.frame(a=1, b='\n') dbWriteTabl
我创建一个 MySQL 表如下: create table schema_name.test ( col1 varchar(10), col2 varchar(10), primary key (co
我正在尝试使用UTF-8编码将我的数据帧写入mysql表。编码似乎无法正常工作。当我在工作台环境中打开表时,UTF-8 编码未按应有的方式设置。出现奇怪的字符。 mysql连接: conn = dbC
问题 我正在尝试将 R 数据帧 df 的内容复制到位于模式 schema_name 中的 PostgreSQL 表 table_name。默认情况下,PostgreSQL 会将表写入public 架构
我似乎无法在任何地方找到这个问题的答案。我正在使用 read.csv 函数将 csv 读取到数据框中。然后我使用 dbWriteTable 将数据帧内容写入 mysql 表。这对于创建表的初始运行非常
我正在尝试将一些 Excel 文件读入数据帧,然后写入 MySQL 数据库。以下程序能够读取文件并创建数据帧,但是当它尝试使用 dbWriteTable 写入数据库时命令,我收到一条错误消息 - Er
我有一个名为 df 的数据框,它看起来像这样: dte, val 2012-01-01, 23.2323 2012-01-02, 34.343 列上的类型是日期和数字。我想使用已经打开的连接将其写入
我正在使用 R 包 RMySQL 和 dbConnect 将我的 R 与我公司的 MySQL 数据库连接起来。简而言之,我的 R 脚本连接到 MySQL 数据库,从数据库中提取一个表 (table1)
在 RMySQL 包中使用 dbWriteTable() 时,无论值如何,逻辑值都写为 0。我希望 TRUE 值会返回 1: # Setup # con is a valid MySQLConnect
我正在使用 RJDBC 从 R 访问 MySQL。之前我曾经使用 RMySQL,它不适用于 R 2.15。围绕 SO 进行了很多讨论,但我仍然无法在 R 2.15 中使用 RMySQL 包,因此切换到
我正在使用 RJDBC 从 R 访问 MySQL。之前我曾经使用 RMySQL,它不适用于 R 2.15。围绕 SO 进行了很多讨论,但我仍然无法在 R 2.15 中使用 RMySQL 包,因此切换到
RPostgreSQL 中的dbWriteTable 函数似乎忽略了列名并尝试按原样将数据从 R 推送到 PostgreSQL。当追加到现有表时,这是有问题的,特别是如果 R 对象中有未指定的列应该被
我刚刚做了一个时间测试,从 csv 加载一个数据数组,在 Postgres 上创建一个数据库,然后用 python 和 R 将表写入它。 我很惊讶,时间非常相似: 首先是 python 代码:(例如)
例如,如何执行等效的以下 SQL(插入 BINARY(16) 字段) INSERT INTO Table1 (MD5) VALUES (X'6717f2823d3202449201145073ab87
我正在使用 SQL Server 数据库和 JDBC 以及带有 sqljdbc42.jar 驱动程序的池。 代码: library(DBI) library(RJDBC) library(pool)
我正在尝试在 64 位 Windows 7 上使用 64 位 R3.0.0 中的 ROracle 包 (1.1-10) 将一些数据上传到我的 Oracle 11g 数据库。 dbWriteTable
我是一名优秀的程序员,十分优秀!