span8
span4
缓存功能(或在FME 2017及更早版本中运行完整检查)允许您存储翻译的中间结果并检查它们。这有助于开发和调试工作区。但是在写入缓存时,它会消耗磁盘空间和资源。确保特性缓存是从运行生产工作区时。当在FME服务器上运行工作区时,会自动关闭特性缓存。
在FME 2015及以上你可以看到动态功能计数。这通常会显示哪些转换器阻塞了您的数据。您还可以运行完整的检查,显示特性计数并在工作区中的每个链接上缓存数据。这对于调试工作区很有用,但是在测试性能问题时不应该使用,因为创建缓存文件会带来开销。
在能够优化工作区之前,了解如何读取FME日志文件是非常重要的。如果没有这些知识,用户常常会对翻译得出错误的结论,开始在错误的地方寻找性能问题。
在尝试加速转换时,检查日志文件以确定时间的准确位置总是有益的。
小提示# 1:检查工具> FME选项>转换>日志时间戳信息是否被选中,以确保在日志中打开计时。它们总是在保存到磁盘的日志文件中打开,但是这个选项也会在日志文件窗口中显示它们。
在日志中要注意的第一件事是,以秒为单位报告的时间是FME处理时间——它可能与流程的总长度不同。例如,这里的运行时间显示这个过程花费了6分钟,但是总字段报告FME只使用了25秒。
|总|增量CPU(秒)
| 8.5| 0.0|
| 8.8| 0.3|
| 18.0| 9.1|
| 25.8| 7.9|
小提示# 2:看FME如何记录处理时间有关为什么记录的FME处理时间不是全部原因的更多信息,为什么这很重要。
因为FME的工作原理是将功能按独立的方式(而不是按组)推送到工作区中FME如何处理特性以及如何影响翻译过程 (获取更多信息)不可能给每个变压器准确的时间。因此,很多时间不会被单独记录,而是被集中到下一个支持计时的函数下。
日志文件中最重要的一项是临时目录。您将看到这个报告是这样的(为了清晰起见,删除了计时)……
通知|FME配置:临时目录是' C:\DOCUME~1\xxxx\ local ~1\Temp'
您还将看到一行注释该目录中可用磁盘空间大小的行…
通知|系统状态:FME临时目录中有37700MB可用磁盘空间
当FME运行大型转换时,通常需要大量临时磁盘空间。当使用多个写入器或扇出时尤其如此。所以可用磁盘空间的数量很重要。但在性能问题上,我们更关心的是所有这些磁盘活动的速度。
小提示# 3:在可能的情况下,将临时目录设置为指向可用的最快磁盘。看到设置临时目录了解如何使用FME_TEMP设置不同的临时目录
技巧3:如果可能的话,为您的临时目录使用SSD(固态驱动器)磁盘。这些都是非常快的,使用将有很大的影响FME文件缓存性能
小提示# 3 b:在可能的情况下,不要将临时目录设置在操作系统使用的同一磁盘上;FME可能会因为操作系统在同一时间写入同一磁盘而变慢。
小提示# 3 c:在可能的情况下,将临时目录设置为具有大量空闲空间的磁盘——它不会提高速度,但可能防止由于磁盘空间不足而导致的大型转换失败。
小提示# 3 d:最后一招,试试那个老的备用——RAM驱动器(也叫RAM磁盘)!将FME临时目录指向RAM驱动器,或在RAM驱动器上放置源数据的副本,将具有与使用SSD相同的好处。
使用RAM驱动器可以100%地提高工作空间完成时间(在某些情况下可减少4小时到2小时),即使是在SSD机器上。特别是,当有文件在翻译过程中被多次读取时,这真的很有帮助。在微站地理学中,访问文件被读取数百次。这最终成为一个真正的瓶颈。因此,通过将输入文件放在RAM驱动器上,它可以在转换开始之前有效地将数据输入缓存到RAM中。这对于具有高磁盘I/O的各种格式都很有用,如XML / GML、或基于文件的数据库(Esri文件地理数据库)等。RAM驱动器在Windows和Linux上都可用。
日志文件的下一部分与读取数据有关。还记得我们在上面说过的FME是通过在工作空间中单独添加功能来工作的吗?一旦从源数据中读取,它就开始处理每个特性。它不会读取所有特性然后开始处理。因此,查看日志文件并试图计算读取数据所花费的时间也同样困难,因为工作区处理时间将与此集中在一起。看到这个例子。本例中的“清空工厂管道”标志着我们已经完成了数据读取。
| 342.7| 0.5|通知|工厂管道排空
在这里,读取源数据花费了342.7秒(大约6分钟)。但是,正如你们现在知道的,这包括在工作区中处理特性所花费的时间。当所有的变压器被从这个工作区移除,我们得到…
| 66.5| 0.3|通知|工厂管道排空
哇!只有一分钟,而不是六分钟。这告诉我们80%的时间用于处理数据,只有20%用于读取数据。在这种情况下,用户认为读取是瓶颈,但这表明它是变换。因此,他应该检查他的工作区,以确保它是尽可能有效的,并且没有不必要的转换器。
小提示# 4:如果您担心工作区的读取性能,请断开读取器与Workbench中的转换器的连接,并再次运行转换。然后比较日志文件。可能您认为工作空间转换器实际使用了很多时间来读取数据,这将显示您应该将精力集中在哪里。
数据库是许多数据集的重要组成部分,日志文件将帮助我们确定我们的数据库性能有多好,再加上FME与数据库的交互能力。上面技巧2中的链接提供了一个很好的示例,它与在Oracle数据库上执行的预取查询有关……
| 476.1| 0.0|通知|启动SQL缓存预取
| 476.2| 0.1|通知|已完成SQL缓存
注意左边实际时间的差异;您可以看到,从发出SQL预取到完成,大约需要7分钟。但是FME只记录0.1秒的CPU时间。由此我们可以说,Oracle使用给定的查询检索数据花费了剩余的时间。为了缩短时间,用户需要了解Oracle数据库的结构和查询的编写方式。也许正在搜索的字段没有索引?也许提供的查询没有预期的那么有效?
冰山# 5:仔细检查日志,看看在FME之外花费了多少与数据库相关的时间,看看是否需要提高数据库效率。说到索引(索引?)——在向表写入数据时,是否索引表的问题会对性能产生很大影响。
写入未索引的表非常快,因为数据库没有开销工作要做。
将数据写入已建立索引的表所需的时间要长得多,因为对于提交的每一行,数据库必须立即对数据建立索引。
如上所述,报告的CPU时间没有变化,因为执行索引工作的是数据库服务器,而不是FME。
冰山# 5 b:在可能的情况下,在批量加载表之前删除索引,然后在加载完成后重新创建它们。它通常比在数据加载期间保留索引要快。
与此相关的是截断表和删除表之间的区别。FME有两个设置,但是,当您截断一个表时,索引将保持不变,随后的数据加载将变慢。当你先放下一张桌子,一个副作用是所有的索引都被删除了,因此,数据可以写得更快,因为没有索引发生。
冰山# 5度:考虑使用这个选项来删除一个表,而不是截断,为了从大容量数据加载中获得更好的性能。在说明技巧5a的示例中,您可以看到缓存的预取。连接变压器使用缓存。细木工将记录与图形特性匹配。当FME读取匹配的数据库记录时,它将把它保存在缓存中。对于后续特性,在FME检查数据库之前,将检查该缓存是否匹配。这样做的好处是,由多个特性匹配的数据库记录不会导致FME每次读取数据库,因为信息已经保存在内存(缓存)中。这使得连接更快,网络流量更少。这里有一个很好的例子……@Relate:表“JOINER:MY_TABLE”的数据库查询统计数据:7个查询,其中0个是连续重复的,1个查询命中了3条记录的记录缓存(总缓存命中量为14%)
首先,它没有明确说明匹配了多少条记录,但是我们可以很好地猜测它是4。三个特征匹配记录,都有不同的id,FME将这些记录添加到缓存中。第四个匹配特性不需要查询数据库,因为它会命中缓存中保存的一条记录。这就是14%的来源,顺便说一下。有7个查询,其中一个查询匹配缓存的记录(1/7 = 14%)。因此FME自动减少了这个查询的网络流量14%。序列重复部分,顺便说一下,指示有多少特性具有相同的键id。例如……@Relate:表“JOINER:MY_TABLE”的数据库查询统计:7个查询,其中3个是连续重复的,2个查询命中了2条记录的记录缓存(71%的总缓存命中)。还有三个重复的特征。重复的功能不需要数据库查询,如果它们是顺序的,那么2(缓存命中)+ 3(重复)= 5和5/7 = 71%
缓存会影响性能,但是用户可以做些什么来帮助呢?有两种设置可以应用在关节器中。
第一个设置是缓存大小。通常只缓存记录的一个子集。缓存大小设置指定这个子集将有多少条记录。一旦缓存被填满,新记录只能通过删除现有记录来添加。因此,数量越大,内存中保存的记录就越多,发生的数据库读取就越少。
显然,设置的大小取决于你有多少条记录,它们与单个记录匹配的频率以及系统包含的内存大小。在某种程度上,不管怎样,读取数据库都会更有效,如果缓存中保存了这么多记录,系统就会耗尽内存。
冰山# 5 d:使用Joiner transformer设置一个缓存大小,该大小与数据集的大小和可能在该缓存中生成的匹配数相匹配。
第二个与缓存相关的设置是预取。与其用匹配的记录填充缓存,发出预取查询的用户可以预加载缓存(即在进行匹配之前填充一组特定的数据)。这个预取查询可以选择一个完整的表,也可以选择最有可能被特性属性匹配的表的一部分。
例如,类型“roads”的许多FME特性需要数据库匹配。数据库表(myrecords)有一个字段(record_type),其中有许多值;道路,高速公路、途径,街道。FME特性只会匹配到record_type=roads的位置,所以如果发出下面的预取,整个连接过程将会更高效。
select * from myrecords where record_type = 'roads'
冰山# 5 e:在Joiner transformer只匹配表中已知的记录子集的情况下,在进行匹配之前预取该记录子集将更有效。
冰山# 5 f:增加交易区间。
通过延长提交事务之间的间隔,可以加快涉及所有作者的翻译。提交事务是一项昂贵的操作,因此,建议您将事务间隔设置得尽可能大。在安全软件的速度测试中,亚搏在线将事务间隔从500更改为1000会使特定的转换速度快2.5%。将事务间隔更改为5000会使相同的转换速度快5.5%。关闭交易可以提高12%或19%。更改事务间隔或关闭事务的性能优势在不同的数据集之间有所不同。
注:如果需要的记录不在预取中,FME将直接到数据库获取它。同时,缓存大小仅在预取不彻底时与预取一起使用,ie有一个where语句。因此,'select * from mytable'作为预取将导致缓存大小被忽略,因为整个记录集已经由FME持有。但是“select * from mytable where type=mytype”将使用缓存,因为预取查询没有获取完整的记录集。
您可以运行FME工作区的概要文件,以获得每个底层工厂或函数中花费的时间的详细日志。使用工具->编辑头添加指令:FME_PROFILE_RESULT_CSV即。FME_PROFILE_RESULT_CSV C: \ TEMP \ profile.csv
请注意:不要忘记为您的生产工作区删除配置文件指令,因为配置文件也会影响性能!
有时候,使用性能监视工具(如PerfMon)来记录进程的CPU和内存使用情况是值得的。
默认情况下,Windows将单个进程可用的内存限制为2Gbytes。FME是一个单线程进程,因此受到这种限制。当超过可用内存时,要么系统崩溃,要么FME需要开始将特性缓存到磁盘,这对性能有非常负面的影响。
考虑到当前数据集的大小,2GB不是一个很大的数字。然而,通过设置一个操作开关,可以将可用内存增加到3gb字节。看到使用/3GB开关如何做到这一点。很明显,您需要安装一台至少有3GB RAM的计算机,然后这个设置才会有所不同。
你也可以用a在64位工作站上运行的32位FME这样就可以访问4Gbytes RAM。
您可能还想考虑在64位处理器上运行FME 64位。FME 64位上支持的一些格式有一些限制。同时,要了解64位应用程序的真正好处,建议您将您通常拥有的RAM数量加倍—即。8 gb RAM的最低
小提示# 6:使用/3GB交换机增加可用内存的数量将使大规模转换运行得更快,并允许一些以前由于内存不足而失败的翻译。
还记得我们说过FME每次只在工作区中推送一个特性吗?但情况并非总是如此。Workbench中的一些转换器一次只处理一个特性(基于特性),而其他的转换器则需要处理一组特性(请参阅关于组的变形金刚)。基于组的变压器是同时处理多个特性的变压器;例如,交叉许多线的特征来产生一个拓扑网络。
很明显,任何处理一组特性的转换器都必须在同一时间将它们全部保存在内存中。
一个问题是如果你有多个基于组的转换器串在一个工作区中,特别是当它们位于单独的流(并行连接)中时,那么您可能在同一时间存储多个数据副本。因此,您正在使用重要的系统资源,并且可能会减慢转换速度,因为它最终将数据缓存到磁盘。
小提示# 7:显然,如果你需要某种变压器的配置,那么你必须使用这种配置,但是请注意,多个基于组的转换器可以非常快地消耗内存,如果可能的话,尽量避免这种情况。
小提示# 7 b:坐下来,放松,看看FME是如何以一种最大化性能的方式处理内存的!
小提示# 7 c:一些分组转换器有一个功能第一选项。例如,PointOnAreaOverlay有一个area First选项。feature uremerger首先有一个供应商。快船先有快船。如果你能恰当地排列你的特征,然后使用这些选项将减少阻塞的数量和减少内存使用。
在转换过程中——正如我们在前面多次提到的那样——FME要么将数据保存在内存中,要么将其缓存到磁盘中。很明显,数据集越小,使用的内存越少,性能越好,这包括属性的数量。
一个特别的问题是将空间数据作为属性进行传递。空间数据库格式——例如Oracle或GeoMedia——通常将几何图形存储在数据库中的一个字段中;例如几何学。当FME读取数据时,它将GEOM字段转换为FME样式的几何图形,并从数据中删除该字段。
但是,通常可以将几何图形存储在多个字段中。有时您希望创建备份副本,有时原始应用程序会为自己的目的创建副本。FME只会将一个字段转换成几何图形,保留其他属性作为属性。非常大和复杂的属性,这会占用大量的系统资源。
我们帮助的一个用户就遇到了这个问题。GIS中的压缩函数,不是简单地压缩原始的几何字段,创造了一个全新的领域。当FME读取数据时,它使用了几何图形的压缩字段,还可以将未压缩的原始数据作为普通属性读取。这导致了经济的大幅放缓,但只要在转换开始时应用AttributeRemover转换器,多余的几何列可以在开始由基于组的转换器读取之前删除,翻译效果大大提高。
另一种需要注意的属性是列表。一个列表可以包含很多,许多属性集,这是对资源的巨大消耗。例如,使用Joiner将一个特性连接到1000条记录,您将得到一个包含1000组记录的列表。这已经够糟了,但是如果你分解列表并保留所有原始属性,然后你会得到1000个具有1000组属性的特性!
小提示# 8:只进行转换的任何几何图形和属性,你打算在输出。删除任何多余的项目在翻译过程中越早越好。
尽可能让数据库来完成这项工作。FME Oracle和大多数其他数据库阅读器都支持fullSQL语句和SQL在哪里条款。使用SQL连接而不是使用FeatureMerger转换器,如果可能的话。创建一个数据库物化视图,以获得更好的性能,并简化您的工作区(尽管有时dba不允许您这样做)。
ArcSDE,SQL语句只支持非空间表。对于空间表的使用:sdetable - o create_view创建包含联接中的空间列的视图。
ArcSDE帮助有关于如何做到这一点的有用提示,查看ArcGIS帮助-快速浏览地理数据库中的视图:http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/A_quick_tour_of_views_in_the_geodatabase/002n000000t0000000/
您可以使用sdetable -o create_view和SQL ALTER VIEW的组合来创建复杂的表连接。
小提示# 9:在某些情况下,FME可以通过将处理传递给数据库来提高性能。
当工作区中有多个写入器时,第一个写入器的数据直接写入,而随后的写入器将缓存数据以备以后写入。这有助于性能本身,但也使导航页中的第一个写入器(可以通过右键单击>向上移动来控制其顺序)比任何其他写入器都更有效。高级工作区参数:Order writer By,允许您设置工作区中的功能部件写入写入器的顺序。
注:订单编写者的参数可在FME 2016年。
冰山# 10:当工作区中有多个写入器时,始终确保获取更多数据的人是列表中的第一个写入者。需要一个例子吗?这个常见问题解答 告诉你所有你需要知道的。
技巧10 b:为峰值性能,光栅或WebMapTiler输出的tile应该按照这些转换器输出的顺序编写。不要在这里使用数据集扇出,因为它重新排序输出和消极地影响性能。
有时,通过将表达式分割成更小的部分并在单个表达式求值变压器中计算这些部分,最容易计算出复杂的数学公式。然而,以这种方式将表达式求值器链接在一起不是处理数据的最有效方法。
原因是FME在TCL脚本中使用属性值,而不是从脚本中的命令读取属性值,但是通过为每个特性重新创建脚本并嵌入相关的值(请注意,这无疑是一个更复杂的问题)。
重点是TCL代码将针对每个ExpressionEvaluator中的每个特性重新编译,将一系列变压器连接在一起只会使问题更加复杂。
小提示# 11:当您在工作区中有多个表达式求值转换器时,考虑将它们压缩到单个表达式求值器中,以减少TCL调用和编译。
另一个选项是用一个TCL脚本替换所有的ExpressionEvaluator转换器。这听起来很吓人,但与之前将复杂算法压缩成单个表达式的思想相比,它可能相对简单。
TCLCaller transformer是一种很好的方法,但是请记住,性能是通过在TCL中通过FME_GetAttribute和FME_SetAttribute专门为此目的提供的功能。
小提示# 11 b:当您在工作区中有多个表达式求值转换器时,考虑用一个包含单个过程中所有表达式的单个TCLCaller转换器替换这些表达式。
不要贪多嚼不烂。如果你有大量的数据要处理,您可能需要考虑将处理过程划分为某种类型的分组,如区域。这样您就不必一次跨整个数据集执行连接。
例如,你可以编写一个Where子句,每次只从加拿大的10个省中选择一个省的数据,所以FME引擎一次只能处理大约10% - 20%的数据。或者可以进行连续的空间范围查询。尽管如此,这将最终使整个国家得到处理。调用工作区的脚本只需要调用10次,每次将要处理的省的名称传递给运行时参数时,该参数依次嵌入到工作区中的SQL或Where子句语句中。
注:此参数的值不应被调整,除非您有特殊情况或已由安全软件指导。亚搏在线更改此值会导致意外行为并降低性能。FME 2018及以上版本不再受益于调整内存红线参数
FME_ENGINE_MEMORY_REDLINE
资源管理器自动确定FME引擎进程应该使用的最佳总内存。它还动态地将总内存优化地分配给请求它的FME中的算法。
的FME_ENGINE_MEMORY_REDLINE指令是对FME引擎的提示,告诉它在消耗内存时应该具有多大的侵略性。它取0到1之间的值(0.5是默认值)。对于更具侵略性的内存使用,应该使用大于0.5的值。为了减少内存使用,应该使用低于0.5的值。过于激进的风险是进程耗尽内存或机器颠簸。过于保守的风险在于,这个过程可能需要更长的时间才能完成。
:: Value = 0.5(默认值)
资源管理器将在“合理的点”隐藏,以尽可能快的速度跑而不冒着失去稳定性的风险为目标。
::值= 0.0
应该立即“优化内存使用”。由于将数据写入磁盘比使用内存资源更昂贵,因此这种做法将导致更长的处理时间。
:: Value = 1.0
对单个进程没有内存限制。只有在整个系统内存不足的情况下才会发生存储。
注意:可以选择上面列出的值之间的值来进一步调整内存使用。
请注意,当将参数值降低到0.5以下时,/tmp或FME_TEMP目录中必须有足够的临时(物理)空间。
注意:在FME 2017.1.0及之前,由于性能问题,Linux倾向于从不存储。Linux行为在FME 2017.1.1中与Windows进行了协调
要在FME Workbench中设置此值,请使用工具-编辑标题并输入:
FME_ENGINE_MEMORY_REDLINE 0.5
作为第一行。有关FME服务器引擎,请参见如何控制FME服务器引擎内存使用。
©2019安全亚搏在线软件公司|法律