斯潘8
斯潘4
特征缓存(或在FME 2017及更早版本中进行全面检查)允许您存储翻译的中间结果并检查它们。这有助于开发和调试工作区。但在写入缓存时,它会消耗磁盘空间和资源。确保功能缓存为远离的运行生产工作区时。在FME服务器上运行工作区时,自动关闭功能缓存。
在FME 2015及以上版本中,您可以查看动态特性计数。这通常会指示哪些变压器正在阻塞您的数据。您还可以使用完整检查运行,该检查显示功能计数并缓存工作区中每个链接上的数据。这对调试工作区很有用,但在测试性能问题时不应使用,因为创建缓存文件会产生开销。
在能够调整工作空间之前,了解如何读取FME日志文件是至关重要的。如果没有这些知识,用户通常会对翻译得出错误的结论,开始在错误的地方寻找性能问题。
当试图加快翻译的速度时,检查日志文件以准确地确定花费时间的位置总是有益的。
尖端1:检查工具>FME选项>转换>日志时间戳信息,以确保在日志中打开时间。它们总是在保存到光盘的日志文件中打开,但此选项也会在日志文件窗口中显示它们。
在日志中要注意的第一件事是,以秒为单位报告的时间是FME处理时间——它可能与整个过程的长度不同。例如,这里所用的时间显示该过程耗时超过6分钟,但是总的现场报告FME只用了25秒。
已用时间总增量CPU(秒)
2006年7月10日14:43:06 8.5 0.0|
2006年7月10日14:43:13 8.8 0.3|
2006年7月10日14:46:29 18.0 9.1|
2006年7月10日14:49:29 25.8 7.9|
尖端2见FME如何记录处理时间有关记录的FME处理时间不完整的原因的更多信息,为什么这很重要。
因为FME的工作原理是将功能单独推过工作区(而不是组-参见FME如何处理特性以及它如何影响翻译过程 更多信息)不可能给出每个变压器的准确时间。因此,很多时间不会单独记录,而是集中在支持计时的下一个函数下。
日志文件中最重要的项目之一是临时目录。您将看到报告的内容类似于此(为了清晰起见,删除了时间安排)…
通知FME配置:临时目录为'C:\docume~1\XXXX\locals~1\temp'
您还将看到一行评论该目录中可用磁盘空间的数量…
通知系统状态:FME临时目录中可用磁盘空间为37700MB
当FME运行一个大的转换时,它通常需要大量的临时磁盘空间。这在使用多个编写器或扇出时尤其适用。因此,可用磁盘空间的数量非常重要。但是在性能问题上,我们更关心所有磁盘活动的速度。
尖端3:尽可能将临时目录设置为指向可用的最快磁盘。见设置临时目录如何使用fme_temp设置不同的临时目录
尖端3a:如果可能,请使用SSD(固态驱动器)磁盘作为临时目录。这些都非常快,使用会对FME文件缓存性能产生很大影响。
尖端3B:尽可能不要将临时目录设置在操作系统使用的同一磁盘上;操作系统同时写入同一磁盘可能会减慢FME的速度。
尖端3C:在可能的情况下,将临时目录设置为具有大量可用空间的磁盘-这不会提高速度,但可能会阻止由于缺少磁盘空间而导致的大型转换失败。
尖端三维作为最后一个办法是试试旧的备用磁盘——RAM驱动器(也称为RAM磁盘)!将FME临时目录指向RAM驱动器,或者将源数据的副本放在RAM驱动器上,将具有与使用SSD相同的好处。
使用RAM驱动器可以将工作区完成时间(在某些情况下可缩短4小时至2小时)提高100%,即使在固态硬盘上。特别地,如果在翻译过程中有多次读取的文件,它确实会有所帮助。对于微站地理而言,访问文件被读取数百次。这最终成为了一个真正的瓶颈。因此,通过将输入文件放在RAM驱动器上,它可以有效地在转换开始之前将输入的数据缓存到RAM中。这对于具有高磁盘I/O的各种格式非常有用,例如XML/GML,或基于文件的数据库(ESRI文件地理数据库)等。RAM驱动器在Windows和Linux上都可用。
日志文件的下一部分与读取数据有关。还记得我们上面说过,FME是通过在工作区中单独推送特性来工作的吗?一旦从源数据中读取每个特性,它就开始处理它。它不会读取所有功能,然后开始处理。因此,查看日志文件并尝试计算读取数据所花费的时间也是同样困难的,因为工作区处理时间将被集中在日志文件中。请参阅此示例。本例中的“清空工厂管道”标记了我们完成数据读取的点。
2006-02-03 11:37:47 342.7 0.5通知排空工厂管道
在这里,读取源数据需要342.7秒(大约6分钟)。但是,你现在知道了,这包括处理工作区中的功能所花费的时间。当所有的变压器都从这个工作区移除后,我们…
2006-02-03 14:44:43 66.5 0.3通知排空工厂管道
真的!只有一分钟而不是六分钟。这告诉我们80%的时间花在处理数据上,只有20%的时间在读取数据。在这种情况下,用户认为阅读是瓶颈,但这表明这是一个转变。因此,他应该检查他的工作空间,以确保它尽可能高效,并且没有不必要的变压器。
技巧4:如果您担心工作区的读取性能,请将读卡器与工作台中的变压器断开连接,然后再次运行转换。然后比较日志文件。这可能是因为工作空间转换器实际使用了大量的时间来读取数据,这将显示出在哪里集中您的性能工作。
数据库是许多数据集的重要组成部分,日志文件将帮助我们确定数据库性能的好坏,加上FME与数据库的交互效果如何。上面技巧2中的链接提供了一个很好的例子,它与在Oracle数据库上执行的预取查询有关…
2004-05-14 17:18:52 476.1 0.0通知已启动SQL缓存预取
2004-05-14 17:25:10 476.2 0.1通知已完成的SQL缓存
注意左边的实际时间差;您可以看到,从发出SQL预取到完成预取之间的时间大约是7分钟。但是,FME只记录0.1秒的CPU时间。由此我们可以说,剩余的时间是由Oracle使用给定的查询检索数据所花费的。为了缩短时间,用户需要了解Oracle数据库的结构以及如何编写查询。也许正在搜索的字段没有索引?也许提供的查询没有它可能的效率那么高?
To.Y.5A:仔细检查日志,了解在FME之外花费了多少与数据库相关的时间,并查看是否需要提高数据库效率。说到指数(指数?)-在向表中写入数据时,表是否被索引的问题会对性能产生很大的影响。
写入未索引的表很快,因为数据库没有开销工作要做。
将数据写入索引表需要更长的时间,因为-对于提交的每一行-数据库必须立即索引数据。
如上,报告的CPU时间不会改变,因为正在进行索引工作的是数据库服务器,而不是FME。
针尖5B:如果可能,在向表中进行大容量加载之前删除索引,然后在加载完成后重新创建它们。它通常比在数据加载期间将索引保留在原位更快。
与此相关的是截断表和删除表之间的区别。FME有两种设置:但是,当您截断一个表时,索引将保持不变,随后的数据加载将变慢。当你先放下桌子时,一个副作用是所有索引都会被删除,因此,可以更快地写入数据,因为没有进行索引。
尖端5C:考虑使用选项删除表,不是截断,为了从批量数据加载中获得更好的性能。在演示技巧5a的示例中,您可以看到缓存的预取。连接转换器使用缓存。接合器将记录与图形功能匹配。当FME读取匹配的数据库记录时,它将把它保存在缓存中。对于后续功能,在FME检查数据库之前,将检查此缓存是否匹配。这样做的好处是,多个功能匹配的数据库记录不会导致FME每次读取数据库,因为信息已经保存在内存中(缓存)。这使得连接更快,从而减少网络流量。这是一个很好的例子…@关系:表'joiner:my_table'的数据库查询统计:7个查询,其中0个是连续重复的,1个命中3个记录的记录缓存(总缓存命中率为14%)。
首先,这并没有明确说明匹配了多少条记录,但我们可以很好地猜测是四点。三个特征匹配记录,都有不同的身份证,FME将这些记录添加到缓存中。第四个匹配功能不必查询数据库,因为它命中了缓存中的一条记录。这就是14%的收入来源,顺便说一句。有七个查询,其中一个与缓存记录匹配(1/7=14%)。因此,FME已经自动减少了14%的网络流量。顺序重复部分,顺便说一句,指示有多少功能具有相同的密钥ID。例如。。。@关系:表'joiner:my_table'的数据库查询统计:7个查询,其中3个是连续重复的,2个查询命中了2个记录的记录缓存(总缓存命中率为71%),其中两个查询命中了缓存。还有三个重复的功能。重复功能不需要数据库查询,如果它们是连续的,那么2(缓存命中数)+3(重复数)=5和5/7=71%
所以缓存会影响性能,但是用户能做些什么来提供帮助呢?有两种设置可以在连接程序中应用。
第一个设置是缓存大小。通常只缓存记录的一个子集。缓存大小设置指定此子集的记录数。一旦缓存被填满,只能通过删除现有记录来添加新记录。因此,数量越大,内存中保存的记录就越多,数据库读取的次数就越少。
显然,设置的大小将取决于您有多少个记录,它们与单个记录匹配的频率以及系统包含的内存量。在某种程度上,读取数据库的效率会更高,如果高速缓存保存了如此多的记录,系统将耗尽内存。
尖端5d:使用JoinerTransformers设置一个缓存大小,该大小与数据集的大小和该缓存中可能进行的数字匹配。
第二个与缓存相关的设置是预取。而不是在缓存中填充匹配的记录,发出预取查询的用户可以预加载缓存(即在进行匹配之前填充特定的数据集)。此预取查询可以选择整个表或表中最可能与功能属性匹配的选定部分。
例如,“道路”类型的许多FME特征需要数据库匹配。数据库表(myrecords)有一个字段(record_type),该字段具有多个值;道路,公路,大道,街道。FME功能将只与记录“类型=道路”匹配,因此如果发出以下预取,整个连接过程将更加高效…
从myrecords中选择*,其中record_type='roads'
尖端5E:如果joiner transformers只在表中的已知记录子集上匹配,则在进行匹配之前预取该记录子集会更有效。
小费5F:增加事务间隔。
通过延长提交事务之间的间隔,可以加快涉及所有编写器的翻译。提交事务是一项昂贵的操作,因此,建议您尽可能增大事务间隔。在安全软件下进行的速度测试中,亚搏在线将事务间隔从500更改为1000会导致特定的转换速度加快2.5%。将事务间隔更改为5000会导致相同的转换速度加快5.5%。关闭交易会导致12%或19%的改善。更改事务间隔或关闭事务的性能优势在不同的数据集之间会有所不同。
铌:所需记录是否不在预取中并不重要-FME将直接进入数据库获取。也,缓存大小仅在预取不完全时与预取一起使用,我有一个Where语句。因此,“select*from mytable”作为预取将导致忽略缓存大小,因为整个记录集已经由FME保存。但“select*from mytable,其中type=mytype”将使用缓存,因为预取查询尚未提取整个记录集。
您可以运行一个FME工作区的概要文件,以获得每个基础工厂或函数所花费时间的详细日志。使用工具->编辑标题添加指令:fme_profile_result_csv,即fme_profile_result_csv c:\temp\profile.csv
注释:不要忘记删除生产工作区的概要文件指令,因为概要文件对性能也有影响!
有时值得使用性能监视工具(如PerfMon)来记录进程的CPU和内存使用情况。
默认情况下,Windows将单个进程的可用内存限制为2G字节。FME是一个单线程的过程,因此是这个限制的牺牲品。当超过可用内存时,系统将崩溃,或者FME将需要开始将功能缓存到磁盘上,这对性能有非常不利的影响。
考虑到当前数据集的大小,2GB不是一个大数字。然而,通过设置操作开关,可以将可用内存量增加到3GB。见使用/3GB开关如何做到这一点。显然,您需要安装至少3GB RAM的计算机,然后此设置才会产生任何影响。
您也可以使用在64位工作站上运行的32位FME它可以访问4G字节的RAM。
您也可以考虑使用在64位处理器上运行的FME64位。FME 64位上的某些支持格式有限制。也,为了实现64位应用程序的真正好处,建议您将通常拥有的RAM数量增加一倍,即最小8GB RAM
技巧6:使用/3GB开关增加可用内存量将使大规模翻译运行更快,允许一些以前由于内存不足而失败的翻译。
还记得我们说过,FME一次推动一个特性通过工作区吗?但情况并非总是如此。当工作台中的一些变压器一次操作一个特性(基于特性)时,其他变压器需要处理一组特性(请参见关于基于组的变压器)群变压器是同时处理多个特性的变压器;例如,与许多线特征相交以生成拓扑网络。
显然,在一组特性上工作的任何转换器必须在同一时间在内存中保存它们。
所以有一个问题是,如果在一个工作空间中有多个基于组的变压器串在一起,尤其是当它们处于单独的流(并行连接)中时,然后,您就可能在同一时间存储多个数据副本。因此,您将耗尽重要的系统资源,并可能降低转换速度,因为最终会将数据缓存到磁盘。
尖端7A:显然,如果您需要变压器的特定排列,则必须使用该排列,但要知道,多个基于组的变压器可以很快耗尽内存,尽可能避免这种情况。
尖端7B坐着,放松,观察FME以最大化性能的方式处理内存!
尖端7C:一些分组变压器有一个特性优先选项。例如,PointOnAreaOverlay有一个区域优先选项。FeatureMerge首先有一个供应商。快船先有快船。如果您可以适当地订购您的功能,然后使用这些选项将减少阻塞量并减少内存使用。
在翻译过程中,我们已经注意到了好几次,FME要么将数据保存在内存中,要么将数据缓存到磁盘中。显然,数据集越小,使用的内存越少,性能越好,这包括属性的数量。
一个特殊的问题是将空间数据作为属性进行携带。空间数据库格式——例如Oracle或geomedia——通常将几何图形存储在数据库中的某个字段中;例如geom。当fme读取数据时,它将geom字段转换为fme样式的几何图形,并从数据中删除该字段。
但是,通常可以将几何图形存储在多个字段中。有时您希望创建备份副本,有时原始应用程序会为自己的目的创建副本。FME只将一个字段转换为几何图形,留下任何其他属性。非常大和复杂的属性,这占用了大量的系统资源。
我们帮助的一个用户就遇到了这个问题。在他的地理信息系统中有一个压缩功能,不是简单地压缩原始几何字段,创建了一个全新的字段。当fme读取数据时,它使用压缩字段作为几何图形,也可以将原始未压缩的数据作为普通属性读取。这导致了严重的经济放缓,但是,只要在翻译开始时应用一个属性移动变压器,多余的几何列可以在开始被基于组的变压器读取之前删除,翻译性能大大提高。
另一种需要注意的属性是列表。一张单子可以带很多,多组属性,这是对资源的巨大消耗。例如,使用Joiner将功能连接到1000条记录,您有一个包含1000组记录的列表。这已经够糟了,但是如果您分解列表并保留所有原始属性,然后,您将获得1000个特性,每个特性都有1000组属性!
尖端8:只有在转换过程中,您想要在输出上可用的任何几何图形和属性才能进行转换。删除任何多余的项目在翻译过程的早期.
尽可能让数据库完成这项工作。FME Oracle和大多数其他数据库读卡器都支持完整的SQL语句和SQL在哪里条款。使用SQL联接而不是使用FeatureMerge Transformer,如果可能的话。创建一个数据库物化视图,以获得更好的性能并简化工作区(尽管有时DBA不允许这样做)。
对ArcSDE来说,只有非空间表才支持SQL语句。对于空间表,请使用:sdetable-o创建视图在联接中创建包含空间列的视图。
ArcSDE帮助提供了有关如何执行此操作的有用提示,请参见Arcgis帮助-地理数据库中视图的快速浏览:http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html/a_-quick_-tour_-views_-in_-geodatabase/002n000000t0000000/
您可以使用sdetable-o create_view和sql alter view的组合来创建复杂的表联接。
尖端9:在某些情况下,通过将处理交给数据库,FME可以提高性能。
当您在一个工作区中有多个写入程序时,第一个写入程序的数据将被直接写入,而后续的编写器则将其数据缓存以备以后写入。这有助于提高性能,但也使导航页面中的第一个编写器(您可以通过右键单击>向上移动来控制其顺序)比其他任何编写器都更高效。高级工作区参数:order writers by,允许您设置将工作区中的功能写入编写器的顺序。
注:按参数排序的订单编写器从FME 2016起提供。
尖端10A:当工作区中有多个写入程序时,始终确保获取大量数据的人是列表中的第一个写入者。需要一个例子吗?这个常见问题解答 告诉你你需要知道的一切。
尖端10B:对于峰值性能,Rastertiler或WebMaptiler输出的图块应按照这些变压器输出的顺序写入。不要在这里使用数据集fanout,因为它重新排序输出和负面影响绩效.
有时,一个复杂的数学公式最容易通过将表达式分成较小的部分并在单个表达式计算器变压器中计算这些部分来计算。然而,以这种方式将ExpressionEvaluator链接在一起并不是处理数据的最有效方法。
这是因为FME在TCL脚本中使用属性值,而不是从脚本中的命令读取属性值,但是,通过为每个特性重新创建脚本并嵌入相关值(请注意,这是我对无疑是更复杂问题的非常松散的解释)。
要点是,Tcl代码会针对每个ExpressionEvaluator中的每个功能重新编译,把一系列的变压器连在一起,问题就复杂了。
To.Y.11A:当您在工作区中有多个ExpressionEvaluator变压器时,考虑将它们压缩成一个单独的ExpressionEvaluator,以减少TCL调用和编译。
另一种选择是用一个TCL脚本替换所有ExpressionEvaluator变压器。这听起来可能令人望而生畏,但与之前将复杂的算法浓缩为单个表达式的想法相比,这是相对简单的。
TclCaller Transformer是一种很好的方法,但是记住性能是通过在TCL中通过FME获取属性和故障模式与后果分析专门为此目的提供的功能。
尖端11B:当您在工作区中有多个ExpressionEvaluator变压器时,考虑用包含单个过程中所有表达式的单个TclCaller Transformer替换这些表达式。
不要咬得太多。如果你有大量的数据要处理,您可能需要考虑将处理划分为某种分组,例如区域。这样就不必一次连接整个数据集。
例如,您可以编写一个WHERE子句脚本,一次只选择来自加拿大10个省的数据,因此,FME引擎一次只能处理大约10-20%的数据。或者可以执行连续的空间范围查询。仍然,这最终将允许整个国家得到处理。调用工作区的脚本只需要调用10次,每次将要处理的省的名称传递给运行时参数时,运行时参数又嵌入到工作区中的SQL或WHERE子句语句中。
注:除非您有特殊情况或安全软件指导,否则不应调整此参数的值。亚搏在线更改此值会导致意外行为并降低性能。FME 2018及以上将不再受益于调整内存红线参数。
发动机记忆红线
资源管理器自动确定FME引擎进程应使用的最佳总内存。它还动态地将总内存分配给请求它的FME中的算法。
这个发动机记忆红线指令是对FME引擎的一个提示,提示它在消耗内存时应该具有多大的攻击性。它的值介于0和1之间(0.5是默认值)。对于更积极的内存使用,应使用大于0.5的值。为了减少内存使用,应使用低于0.5的值。过于激进的风险是进程内存不足或机器不稳定。过于保守的风险是这个过程可能需要更长的时间才能完成。
::值=0.5(默认)
资源管理器将“在一个合理的地点”隐藏,以尽可能快的速度奔跑而不危及稳定为目标。
值=0
“优化内存使用”应该立即发生。这种做法将花费更长的处理时间,因为将数据写入磁盘比使用内存资源更昂贵。
值=1
对单个进程没有内存限制。只有当整个系统内存极低时,才会发生存储。
注意:可以选择上面列出的值之间的值来进一步调整内存使用情况。
请注意,当将参数值降低到0.5以下时,必须在/tmp或fme_temp目录中存在足够的临时(物理)空间。
注:在FME 2017.1.0及更早版本中,由于性能问题,Linux倾向于从不存储。在FME 2017.1.1中,Linux行为与Windows协调。
要在FME工作台中设置此值,请使用工具-编辑标题并输入:
FME_引擎_内存_红线0.5
作为第一行。对于FME服务器引擎,请参见如何控制FME服务器引擎内存使用.
?2019安全亚搏在线软件公司|合法的