使用 python 生成唯一 json 的问题
Problems to generate a unique json using python
经过几次尝试和研究,我一直在尝试如何使用 cur.itersize 解决错误内存问题,但仍然遇到问题,因为它没有生成我期望的唯一 json包含所有行的文件,我得到的是一次又一次生成相同的文件,不知道如何做才能使块附加到一个唯一的 json 文件中。
我试图在没有
的唯一查询中 运行 它
for row in cur:
并更改 fetchmany() 和 fetchall() 但是 table 查询很大,并且在 PostgreSQL 中弹出内存不足的错误,我需要整个数据集。
for y in x:
cur = connection.cursor('test')
cur.itersize = 2000
cur.execute(
" SELECT * FROM table "
print("fetching data for " + y)
for row in cur:
rows = cur.fetchmany(2000)
print("Generating json")
rowarray_list = []
print("parsing rows to json file")
json_data = json.dumps(rows)
filename = '%s.json' % y
print('File: ' + filename + ' created')
with open(filename, "w") as f:
f.write(json_data)
您可以采取一些措施来解决内存问题和错误,并提高性能。
- 使用 limit/offset 限制查询结果并使用
fetchall
而不是 fetchmany
。即“SELECT * FROM table LIMIT 10 OFFSET 0”;
- 将
open
中的模式设置为“a”(附加)而不是“w”(写入);
我建议的代码:
limit = 10
for y in x:
print("fetching data for " + y)
filename = '%s.json' % y
page = 0
while 1:
offset = limit * page
with connection.cursor() as cur:
cur.execute("SELECT * FROM table LIMIT %s OFFSET %s", (limit, offset))
rows = cur.fetchall()
if not rows:
break
with open(filename, "a") as f:
f.write(json.dumps(rows))
page += 1
经过几次尝试和研究,我一直在尝试如何使用 cur.itersize 解决错误内存问题,但仍然遇到问题,因为它没有生成我期望的唯一 json包含所有行的文件,我得到的是一次又一次生成相同的文件,不知道如何做才能使块附加到一个唯一的 json 文件中。 我试图在没有
的唯一查询中 运行 它for row in cur:
并更改 fetchmany() 和 fetchall() 但是 table 查询很大,并且在 PostgreSQL 中弹出内存不足的错误,我需要整个数据集。
for y in x:
cur = connection.cursor('test')
cur.itersize = 2000
cur.execute(
" SELECT * FROM table "
print("fetching data for " + y)
for row in cur:
rows = cur.fetchmany(2000)
print("Generating json")
rowarray_list = []
print("parsing rows to json file")
json_data = json.dumps(rows)
filename = '%s.json' % y
print('File: ' + filename + ' created')
with open(filename, "w") as f:
f.write(json_data)
您可以采取一些措施来解决内存问题和错误,并提高性能。
- 使用 limit/offset 限制查询结果并使用
fetchall
而不是fetchmany
。即“SELECT * FROM table LIMIT 10 OFFSET 0”; - 将
open
中的模式设置为“a”(附加)而不是“w”(写入);
我建议的代码:
limit = 10
for y in x:
print("fetching data for " + y)
filename = '%s.json' % y
page = 0
while 1:
offset = limit * page
with connection.cursor() as cur:
cur.execute("SELECT * FROM table LIMIT %s OFFSET %s", (limit, offset))
rows = cur.fetchall()
if not rows:
break
with open(filename, "a") as f:
f.write(json.dumps(rows))
page += 1