嗨我有一个大约1000000行的数据库。由于我想使用mongodb,我编写了以下代码将其转换为json,但需要花费很多时间。还有另一种方法可以解决这个问题。
import psycopg2
import json
con = psycopg2.connect(database)
cur = con.cursor()
sql="select * from mini; "
cur.execute(sql)
rows=cur.fetchall()
json_string=[]
for sample in rows:
#print(sample)
dicti={"label1":sample[0],"label2":sample[1],"label3":sample[2]}
#print(json.dumps(dicti))
json_string.append(dicti)
f=open('xyz.txt','w')
print >>f,json_string
f.close()
这里label1,label2,label3是sql的列名,如果有帮助的话。
答案 0 :(得分:1)
您正在为每一行创建一个字典,然后将其转换为字符串。跳过转换并手动创建json。我用timeit模块测试了几种方法:
>>> '{{"label1": {0}, "label2": {1}, "label3": {2}}}'.format('1','2','3')
>>> timeit.timeit("""'{{"label1": {0}, "label2": {1}, "label3": {2}}}'.format('1','2','3')""")
1.3898658752441406
>>> '{"label1": ' + '1' + ', "label2": ' + '2' + ', "label3": ' + '3' + '}'
>>> timeit.timeit("""'{"label1": ' + '1' + ', "label2": ' + '2' + ', "label3": ' + '3' + '}'""")
0.506464958190918
>>> str({"label1": '1', "label2": '2', "label3": '3'})
>>> timeit.timeit(""" str({"label1": '1', "label2": '2', "label3": '3'}) """)
4.776309013366699
如何创建json还有其他可能性。
答案 1 :(得分:1)
使用DictCursor
会更简单,它将从您的数据库中返回字典:
import psycopg2
import json
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
rows = cur.execute('SELECT * FROM mini')
with open('xyz.txt', 'w') as f:
for row in rows:
f.write('{}\n'.format(json.dumps(row)))
要将整个数据集转储为一个大型json对象,请改为:
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
rows = cur.execute('SELECT * FROM mini')
dataset = list(rows)
with open('xyz.txt', 'w') as f:
json.dump(dataset, f)
答案 2 :(得分:0)
如果获取部分是花费大部分时间的地方,那可能是因为你需要大量内存而系统必须进行许多重新分配,甚至更糟糕的是交换。您可以尝试使用fetchmany而不是带有合理大小的fetchall,并且(相同)通过块写入磁盘。
所以你会有类似的东西:
import psycopg2
import json
con = psycopg2.connect(database)
cur = con.cursor()
sql="select * from mini; "
cur.execute(sql)
size = 256 # find a 'good' size
with open('xyz.txt', 'w') as f:
while True:
rows=curs.fetchmany(size)
if len(rows) == 0:
break
json_string=[]
for sample in rows:
#print(sample)
dicti={"label1":sample[0],"label2":sample[1],"label3":sample[2]}
#print(json.dumps(dicti))
json_string.append(dicti)
print >>f,json_string
答案 3 :(得分:0)
这应该有效:
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
sql = "SELECT row_to_json(row) FROM (select * from mini) row;"
cur.execute(sql)
result = cur.fetchone()
result[0]
# -> [{'col1':'val1', 'col2':'val2', ...}]