原文地址:
https://knowledge.safe.com/articles/79739/feature-caching-and-performance.html
问题
要素缓存如何影响FME工作空间的性能?
回答
这是一个很好的问题。要素缓存有多种方式影响工作空间性能。
注意: 有关要素缓存功能的更新,请查看FME Workbench文档下的“关于要素检查”。
创建缓存数据
当FME Workbench使用要素缓存选项运行工作空间时,将缓存要素。缓存由绿色图标表示,当工作空间运行并缓存要素时,图标将显示动画。
如上,工作空间运行后在每个步骤缓存了数据。
性能影响: 当工作空间使用要素缓存初始化运行时,性能会受到影响。因为它需要时间和系统资源来创建缓存并填充数据。
但是,其目的是在重新运行工作空间时节省缓存数据花费的时间,将缓存要素作为源数据读取避免重新运行整个工作空间。
读取缓存数据
在设计和测试工作空间过程中,通常不需要重新运行整个转换。当要素被缓存,就可以使用它们作为源数据,忽略前面没有被编辑的转换。
上图中,编辑了工作空间中的StatisticsCalculator 转换器。图标颜色的改变表明后面的转换器也受到改变的影响。为了得到正确的输出,而不用重新运行整个工作空间,在AreaCalculator中缓存的要素可以被用做源数据。这是通过从StatisticsCalculator运行工作空间来实现的:
性能影响:因为工作空间中被编辑的StatisticsCalculator转换器之前的部分没有重新运行,整个整体性能要快得多。性能的提高与跳过转换器的工作直接相关。例如,通过缓存Geocoder转换器的结果可以节省大量时间,避免后续调用同一个Web服务。
目的是在“部分运行”节省的时间抵消了工作空间初始化运行时丢失的时间。
折叠书签Collapsed Bookmarks
当工作空间运行并缓存数据时,将缓存每个要素类或转换器的输出端口。
如上,例如,书签中展开的每个转换器缓存它的要素。
但是,在设计和测试工作空间时,并不需要缓存所有要素。已经过满意测试的部分将不会被进一步编辑,因此不需要进行缓存。在这种情况下,可以通过折叠它们所在的书签来防止缓存每个转换器。
现在当运行工作空间时,只缓存折叠书签的输出端口。在内部的转换器将不再缓存要素。
性能影响:通过折叠书签,减少要素缓存,工作空间可以执行得更快并使用更少的系统资源。
没有连接的输出端口
FME中的很多转换器设计创建多个输出端口。通常,FME仅为连接的输出端口创建输出。
上图中,例如,工作空间使用SurfaceModeller转换器将等高线转为TIN表面。因为只连接了TINSurface输出端口,所以只创建TIN表面。
但是,当激活要素缓存时,则认为所有输出端口都已经连接,将创建所有输出。
如上,要素缓存导致所有输出被创建,即使只有TINSurface端口有连接。
性能影响:一方面,这是一个有用的功能,允许用户无需连接输出端口就可以检查不同结果。另一方面,这个过程耗时更长且使用更多系统资源;不只是因为正在缓存更多数据,而是因为正在进行更多计算以生成所有不同的输出。
并行处理
并行处理是使用多个进程提高性能的技术。通常使用自定义转换器来实现。但是,当激活要素缓存时,不允许在自定义转换器中使用并行处理。
性能影响:虽然使用“部分运行”可以节约要素缓存的时间,但它会导致并行处理性能提升的损失。工作空间创建者必须平衡每种技术的优势,并选择哪种技术产生最佳性能。
大数据缓存
当涉及的数据量非常大时,缓存时性能的降低尤其明显。例如,提供多个栅格文件,每个文件都比较大,缓存所有数据将消耗大量的系统资源。所以,在激活缓存前需要考虑是否真的需要进行缓存。另外,确保在属性方面执行通常的最佳实践;也就是说,使用AttributeRemover尽可能早地在工作空间中删除多余的属性(如果不是必须的话,完全不要读取它们),特别是当不再需要列表属性时,删除列表属性。
另外一个建议是使用一小部分数据来设计和测试工作空间,当全部数据准备好投入生产时,关掉缓存。
性能影响:Performance Effects: 要素缓存背后的思想是通过使用“部分运行”来节省时间和资源。如果初始缓存数据的时间和资源大于部分运行的时间,则不应应用要素缓存。大型数据集可能导致过多的缓存,因此在可能的情况下应避免。
总结
通过允许工作空间的“部分运行”,要素缓存在性能方面可以有非常大的好处。但是,也会在很多情况下具有负面影响。必须小心避免缓存过多非必要的数据,在必要时候使用折叠书签。这包括具有多个未使用输出端口的转换器,在要素缓存模式下产生比预期更多的数据。