python csv 大文件_Python性能调优:JSON到CSV,大文件
一位同事要求我将"yelp数据集挑战"中的6个大文件从"扁平"的常规JSON转换为CSV(他认为这些文件看起来像有趣的教学数据)。
我想我可以用:
1
2
3
4
5
6
7
8
9
10
11
12
13# With thanks to http://www.diveintopython3.net/files.html and https://www.reddit.com/r/MachineLearning/comments/33eglq/python_help_jsoncsv_pandas/cqkwyu8/
import os
import pandas
jsondir = 'c:\\example\\bigfiles\'
csvdir = 'c:\\example\\bigcsvfiles\'
if not os.path.exists(csvdir): os.makedirs(csvdir)
for file in os.listdir(jsondir):
with open(jsondir+file, 'r', encoding='utf-8') as f: data = f.readlines()
df = pandas.read_json('[' + ','.join(map(lambda x: x.rstrip(), data)) + ']')
df.to_csv(csvdir+os.path.splitext(file)[0]+'.csv',index=0,quoting=1)
不幸的是,我的计算机内存达不到这个文件大小的任务。(即使我摆脱了循环,虽然它在不到一分钟的时间内发出50MB的文件,但它仍在努力避免冻结我的计算机或崩溃在100MB以上的文件上,最大的文件是3.25GB。)
是否还有其他简单但性能良好的东西可以替代?
在一个循环中是很好的,但是如果文件名对内存有影响的话(只有6个文件),我也可以用单独的文件名运行6次。
这里是一个".json"文件内容的例子——注意每个文件实际上有很多json对象,每行1个。
1
2
3{"business_id":"xyzzy","name":"Business A","neighborhood":"","address":"XX YY ZZ","city":"Tempe","state":"AZ","postal_code":"85283","latitude":33.32823894longitude":-111.28948,"stars":3,"review_count":3,"is_open":0,"attributes":["BikeParking: True","BusinessAcceptsBitcoin: False","BusinessAcceptsCreditCards: True","BusinessParking: {'garage': False, 'street': False, 'validated': False, 'lot': True, 'valet': False}","DogsAllowed: False","RestaurantsPriceRange2: 2","WheelchairAccessible: True"],"categories":["Tobacco Shops","Nightlife","Vape Shops","Shopping"],"hours":["Monday 11:0-21:0","Tuesday 11:0-21:0","Wednesday 11:0-21:0","Thursday 11:0-21:0","Friday 11:0-22:0","Saturday 10:0-22:0","Sunday 11:0-18:0"],"type":"business"}
{"business_id":"dsfiuweio2f","name":"Some Place","neighborhood":"","address":"Strip or something","city":"Las Vegas","state":"NV","postal_code":"89106","latitude":36.189134,"longitude":-115.92094,"stars":1.5,"review_count":2,"is_open":1,"attributes":["BusinessAcceptsBitcoin: False","BusinessAcceptsCreditCards: True"],"categories":["Caterers","Grocery","Food","Event Planning & Services","Party & Event Planning","Specialty Food"],"hours":["Monday 0:0-0:0","Tuesday 0:0-0:0","Wednesday 0:0-0:0","Thursday 0:0-0:0","Friday 0:0-0:0","Saturday 0:0-0:0","Sunday 0:0-0:0"],"type":"business"}
{"business_id":"abccb","name":"La la la","neighborhood":"Blah blah","address":"Yay that","city":"Toronto","state":"ON","postal_code":"M6H 1L5","latitude":43.283984,"longitude":-79.28284,"stars":2,"review_count":6,"is_open":1,"attributes":["Alcohol: none","Ambience: {'romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': False}","BikeParking: True","BusinessAcceptsCreditCards: True","BusinessParking: {'garage': False, 'street': False, 'validated': False, 'lot': False, 'valet': False}","Caters: True","GoodForKids: True","GoodForMeal: {'dessert': False, 'latenight': False, 'lunch': False, 'dinner': False, 'breakfast': False, 'brunch': False}","HasTV: True","NoiseLevel: quiet","OutdoorSeating: False","RestaurantsAttire: casual","RestaurantsDelivery: True","RestaurantsGoodForGroups: True","RestaurantsPriceRange2: 1","RestaurantsReservations: False","RestaurantsTableService: False","RestaurantsTakeOut: True","WiFi: free"],"categories":["Restaurants","Pizza","Chicken Wings","Italian"],"hours":["Monday 11:0-2:0","Tuesday 11:0-2:0","Wednesday 11:0-2:0","Thursday 11:0-3:0","Friday 11:0-3:0","Saturday 11:0-3:0","Sunday 11:0-2:0"],"type":"business"}
嵌套的JSON数据可以简单地保留为表示它的字符串文本——我只想将顶级键转换为CSV文件标题。
您可以尝试一次在一个JSON字典或一个csv行中读取整个文件,然后将其解析并插入csv,而不是一次读取和解析整个文件。它将需要更多的手工编码,但将在文件流样式下运行良好。
问题是,您的代码将整个文件读取到内存中,然后在内存中创建该文件的近副本。我怀疑它还创建了第三个副本,但还没有验证。NEOX建议的解决方案是逐行读取文件并进行相应的处理。这里是for循环的替换:
1
2
3
4
5
6
7
8for file in os.listdir(jsondir):
csv_file = csvdir + os.path.splitext(file)[0] + '.csv'
with open(jsondir+file, 'r', encoding='utf-8') as f, open(csv_file, 'w', encoding='utf-8') as csv:
header = True
for line in f:
df = pandas.read_json(''.join(('[', line.rstrip(), ']')))
df.to_csv(csv, header=header, index=0, quoting=1)
header = False
我已经在Mac上用python 3.5测试过这个;它应该在Windows上工作,但我还没有在那里测试过。
笔记:
我已经调整了您的JSON数据;第一行的纬度/经度似乎有错误。
这只是用一个小文件进行了测试;我不确定从何处获取3.5GB文件。
我假设这是你朋友的一次性用法。如果这是生产代码,则需要验证"with"语句的异常处理是否正确。看看如何在python中使用"with open"打开多个文件?详情。
这应该是相当好的表现,但我还是不确定从哪里得到你的大文件。
查看ijson,它使流式处理JSON文件像使用Python迭代器一样简单。
@凯文:问:为什么你的to_csv()不包括mode='a'参数?在一个with open中调用to_csv()会自动附加吗?而且,您的代码工作得很好——转换一个小文件需要更长的时间,但是我的计算机不再冻结,而且工作仍然在合理的时间内完成(应该很容易在一天结束之前完成),所以我可以让它在后台运行。非常感谢。(最后,我编辑了您的代码,以便在输出文件中包含UTF-8编码——在执行此操作之前,我一直在获取带有外部输入数据的错误。)
@ K。很高兴我能帮忙!由于csv已经打开,传递到to_csv()中,所以to_csv()在写入后不关闭文件。您可以通过查看源代码中的def save()来验证;它将close = False设置为第1476行。github.com/pandas dev/pandas/blob/master/pandas/formats/…。好问题!
python csv 大文件_Python性能调优:JSON到CSV,大文件相关推荐
- ceph分布式文件存储性能调优
ceph分布式文件存储性能调优 一.硬件调优 二.BIOS配置 三.网络配置 四.OS配置 五.硬盘调度算法 六.软件层面 七.ceph参数调优 一.硬件调优 1.NVMe SSD 调优 ● 目的 为 ...
- Hive 大数据表性能调优
大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...
- 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- Spark 性能常规性能调优广播大变量_大数据培训
常规性能调优四:广播大变量 默认情况下,task中的算子中如果使用了外部的变量,每个task都会获取一份变量的复本,这就造成了内存的极大消耗.一方面,如果后续对RDD进行持久化,可能就无法将RDD数据 ...
- ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南
文章目录 1.通用优化策略 1.1 通用最小化法则 1.2 职责单一原则 1.3 其他 2.写性能调优 2.1 基本原则 2.2 优化手段 2.2.1 增加 flush 时间间隔, 2.2.2 增加` ...
- 一篇最通俗易懂的性能调优总结,这篇就够了
一,什么是性能调优? 在说什么是性能调优之前,我们先来说一下,计算机的体系结构. 如上图,简单来说包括三块:硬件.操作系统.应用程序.其实,性能调优就是调节这些内容,包括硬件.操作系统.应用程序.其中 ...
- 阿里资深软件测试工程师总结的这几点,让你轻松搞懂性能调优
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How ...
- 一篇让小白彻底搞懂性能调优!
前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...
- 「入门运维必看」一篇让小白彻底搞懂性能调优!
前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...
最新文章
- java 最小化 api_Java的API设计实践
- PICRUSt2分析实战:16S扩增子OTU或ASV预测宏基因组EC、通路、KO(200806更新)
- time Machine备份时间间隔
- C# Soap调WebService
- opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽
- 泛微e9隐藏明细表_泛微E8 隐藏行、明细表
- 如何ALL IN一场技术大会?
- 用matlab做纹理合成,关于图像纹理合成的Matlab例程
- NodeJS的安装与使用
- Net框架下-ORM框架LLBLGen的简介(转载)
- java1.7环境_java1.7环境变量设置
- 踩过的坑:__file__、__package__和__name__
- 校园招聘--百度笔试
- 进程间通信----共享内存
- Bootstrap插件(一)——模态框(modal.js)
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java面向新手投资者的虚拟股票交易系统h1o29
- 列车信息系统Java+MySQL(没完全实现)
- webstorm 常用插件集合
- 启用计算机的无线同屏,完美:将计算机转换为无线显示器,Windows 10的此功能确实强大...
- 大象高端营销:家装电话营销细节和技巧
热门文章
- 不同版本GCC编译器之间的切换
- linux i217 v网卡驱动,手动安装Intel network I217-LM网卡的Linux驱动
- leetcode_median of two sorted arrays
- 【笔记】基于轻量和积网络及无人机遥感图像的大豆田杂草识别
- [云炬创业管理笔记]第十章商业计划书答辩测试2
- [云炬创业基础笔记]第一章创业环境测试12
- ustc小道消息20220122
- 一个简单的c++/cli中委托与事件的处理模型
- OpenGL从入门到精通--纹理
- ifstat,iftop