span8
span4
亲爱的社区亚搏国际在线官网,
我有一个假说即使用csv模块和执行一个简单的Python 2.7处理任务使用数据存储到一个大* . csv有显著积极影响执行任务所需的时间与使用的FME基金工具来执行相同的任务。我将下面这个简单的任务分配给了一个空工作区中的“启动python脚本”,其中有一个已发布的参数('OSG_SDTF'),该参数用于获取任务中使用的*.csv的路径。
(A)读取一个大*.csv档案(即一7,977,400条记录,包含19个列中的值,存储在一个2 GB的逗号分隔的*.csv文件中。
(B)返回一个集合(即不允许在大*.csv ('col0')的一个列中找到重复的值。
(C)将结果打印到FME工作台的“翻译日志”中。
我使用的代码如下:
使用FME工具导入fmeobjects, FME def param_value(parameter_name):返回FME。macroValues def reader_params(): return fmeobjects.FMEDialog().sourcePrompt('','',[])[2] def universal_reader(reader_name,parameters): return fmeobjects.FMEUniversalReader(reader_name,False,parameters) def csv_value(csv_reader,csv_parameters,csv_filepath): result = [] o = csv_reader.open(csv_filepath,csv_parameters) feature = csv_reader.read() while feature != None: result.append(feature.getAttribute('col0')) return set(result) CsvFilepath = param_value('OSG_SDTF') CsvRParams = reader_params() CsvReader = universal_reader('CSV',CsvRParams) CsvValue = csv_value(CsvReader,CsvRParams,CsvFilepath) print CsvValue ### USING PYTHON 2.7 & THE CSV MODULE ### import fme import csv def param_value(parameter_name): return fme.macroValues[parameter_name] def csv_reader(file_path_r): open_file = open(file_path_r,'rb') return csv.reader(open_file,delimiter = ',') def record_ids(csv_reader,value): result = [] for row in csv_reader: result.append(row[value]) return set(result) CsvFilepath = param_value('OSG_SDTF') CsvReader = csv_reader(CsvFilepath) RecordIds = record_ids(CsvReader,0) print RecordIds
结果:
使用Python 2.7 & csv模块在1分19秒内打印结果,使用FME工具启动脚本持续运行19分钟,直到我刚刚停止它,因为我已经证明了我对csv模块效率的假设。注意:我还尝试在FME工作空间中使用AttributeFilter和相同的*.csv来重复这个过程,结果相当令人失望,因为在离开机器通宵运行之后并没有产生一个结果,而且临时文件夹中已经装满了26gb的数据!
洞察力?
我在日常工作中使用FME来支持不同格式的数据质量、数据整合和数据处理工作,但是效率对我的工作也很重要。在Safe中是否有一个基准测试团队可以提供关于不同读者效率的一些见亚搏在线解,以便我可以在将数据导入FME工作区之前寻找支持数据清理的开源替代方案?
我之前已经发布过这个,但是您可以考虑使用PythonCreator读取CSV,同时仍然使用常规工作台:
import fmeobjects import csv class FeatureCreator(object):def\uu init(self):self.inputfilename=FME\u宏值[“INPUT\u csv\u FILE”]self.csvdelimiter=','\35;根据需要修改self.csvquotechar='“'\Modify as needed self.log=fmeobjects.FMELogFile()self.fieldnames=[]def close(self):打开(self.inputfilename,'rb')作为csvfile:csv reader=csv.reader(csvfile,delimiter=self.csvdelimiter,quotechar=self.csvquotechar)代表n,在枚举中的行(csvreader):如果n==0:self.field names=row self.log.logMessageString(“要在PythonCreator中公开的csv字段名:”,fmeobjects.FME_WARN)代表行中的字段:self.log.logMessageString(“+field,fmeobjects.FME_WARN)else:feature=fmeobjects.FMEFeature()用于m,枚举中的值(行):feature.setAttribute(self.fieldnames[m],value)self.pyoutput(feature)
这会让你两全其美。
大卫
一个更公平的测试是在一个工作区上运行Python CSV模块,这个工作区可以满足您的需要。一般来说,我们强烈建议不要只使用工作区而使用FME对象。
如果你这样做了,你可以使用CSV阅读器,在它的设置中打开SORT选项,让它按照你想删除重复项的列对字段进行排序。然后,在FME 2016中,将读取的结果路由到DuplicateRemover中,并指示您的输入是有序的。这样会有更好的表现。
我认为教训是在你解决问题的过程中发挥FME的优势。当心那些会阻塞功能的东西——这会导致性能下降。并尝试尽可能早地精简并从流中删除数据。
尽管如此,我仍然确信python raw CSV的阅读将击败我们。现在。我们正在研究一些革命性的技术,这将帮助我们与这个讨厌的坏男孩巨型CSV文件,所以我期待着揭晓。在舞台上。把FME放在一块黑色桌布下面,我就把它扯下来。穿着高领毛衣。
但那还得等一段时间。。。
你好,戴尔,谢谢你的全面意见和建议;我以前没有在CSV阅读器中使用过“排序”复选框,我相信这会对我今后的工作产生影响。
我同意测试是**不是**最佳的,甚至是科学上合理的(我之所以强调这一点,是因为我在第一篇文章中使用了“重要的”工作)。这个测试的基础是**初步的**我知道很多人使用Python方法来处理*.csv文件和使用FME来执行相同的任务(我想你会同意FME有多种实现相同任务的方法)。这就是为什么我在第一时间发布了这个消息;以获得对这一初步观察的见解,并感谢您提供了一些。
我期待您的新CSV阅读器将是非常有效的,所以我期待着那一天!
注:Dale在FME 2015中建议的工作区在37分40.2秒内产生结果。
此块可能导致无限循环。。。
while功能!=无:result.append(feature.getAttribute('col0'))
当读取器完成从源数据集中读取每个功能时,“read”方法返回None。当“read”方法返回一个feature实例时,您必须重复读取下一个feature。
例如将原始脚本的17-20行替换为
feature=csv_reader.read()#在功能运行时读取第一个功能!=无:result.append(feature.getAttribute('col0'))feature=csv_reader.read()#读取下一个功能
或
当为True时:feature=csv_reader.read(),如果feature==None:break result.append(feature.getAttribute('col0'))
用Python进行CSV处理将胜过FME,这一点也不奇怪,但这就像是在编程语言之间进行测试,因为编程语言之间的测试在一个任务中速度更快,测试在非常有限的情况下就变成了人为的。
©2019安全亚搏在线软件公司法律