所以我有这个大小为380 MB左右的csv文件。我创建了一个空数据结构,如下所示: {ID1 {day1:[[flow,hour1],[flow,hour2] ... [flow,hour23]],day2:[...] ... day30:[...]},ID2 ...... }。我从csv中提取并用下面的循环填充这个结构,大约需要3分钟。大约有2000个ID,每个30天,每个24小时。然后当我尝试将这个填充的结构转储到json文件中时,在我退出脚本之前需要几个小时并且输出文件的大小超过3 GB。由于JSON应该更紧凑,这应该发生吗?因为我尝试使用较小的秤(1000个条目)并且运行良好。有没有一个好方法来处理这个?谢谢。
注意:'station'是行['ID']也应匹配的站点列表。
import csv
import json, pprint, datetime, time
meta_f = open( metadata_path , 'rb' )
meta_read = csv.DictReader(meta_f,delimiter='\t')
hour_f = open(hourly_path,'r')
hour_read = csv.DictReader(hour_f, delimiter=',')
stations = []
no_coords = []
for i,row in enumerate(meta_read):
if not row['Longitude'] or not row['Latitude']:
no_coords.append(row['ID'])
elif in_box(row,bound):
stations.append(row['ID'])
data={}
number_of_days=30
days={}
for i in range(1,number_of_days+1):
days[i]=[]
for station in stations:
data[int(station)]=days
with open('E:/pythonxy/Projects/UP/json_data.txt','wb') as f:
json.dump({},f)
f.close()
with open('E:/pythonxy/Projects/UP/json_data.txt','rb') as f:
d=json.load(f)
#i=0
t0=time.time()
for row in hour_read:
#if i>1000:
#break
if row['Station'] in stations:
#print row['Station']
t=datetime.datetime.strptime(row['TimeStamp'], '%m/%d/%Y %H:%M:%S')
data[int(row['Station'])][int(t.day)]+=[[row['TotalFlow'],t.hour]]
#i+=1
#print i
d.update(data)
print time.time()-t0
t0=time.time()
with open('E:/pythonxy/Projects/UP/json_data.txt','wb') as f:
json.dump(d,f)
f.close()
print time.time()-t0
print 'DONE'
答案 0 :(得分:2)
本身并不是一个真正的答案,但JSON实际上不如CSV那么紧凑。举个例子。
CSV:
X,Y,Z
1,2,3
4,5,6
JSON:
[{X:1,Y:2,Z:3},{X:4,Y:5,Z:6}]
CSV为17字节,JSON为29!
答案 1 :(得分:2)
for station in stations:
data[int(station)]=days
您使用此循环在data
中创建的每个条目都引用与值相同的dict。这意味着每次向任何data[something]
dict添加内容时,都会将其添加到所有这些dict中。将它转储到文件时的结果是错误的和巨大的。为避免这种情况,您可以深层复制days
词典:
from copy import deepcopy
for station in stations:
data[int(station)] = deepcopy(days)