所以我有这个CSV文件,大小为380 MB左右。 我为此创建了一个空数据结构:{ID1 {day1:[[flow,hour1],[flow,hour2] ... [flow,hour23]],day2:[...] ... day30:[ ...]},ID2 ...}。 我从csv中提取内容,并在下面的循环中填充了此结构,这大约需要3分钟。 每30天,每24小时大约有2000个ID。 然后,当我尝试将此填充的结构转储到json文件中时,花费了数小时,并且输出文件的大小超过了3 GB,然后我退出了脚本。 由于JSON应该更紧凑,这是否应该发生? 因为我尝试使用较小的比例尺(1000个条目)并且效果很好。 有解决这个问题的好方法吗? 谢谢。
注意:'stations'是row ['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'