python json.dump创建了一个太大的文件

时间:2014-07-06 00:10:56

标签: python json csv

所以我有这个大小为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'

2 个答案:

答案 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)