西班牙
斯潘4
大家好,
这是我在这里的第一篇文章,如果这是一个基本的问题,我会道歉。我有一个关于我正在使用的工作区运行器操作的快速例子。我有一个项目是有意义的,正在工作,但我正在努力使它更有效。
它接受2个文件,workspace runner将文件a传递给它,workspace运行并将a中的变量匹配到另一个静态文件b。然后将结果文件输出到文件c中。这一切都有道理。它工作得很好。
不过,如果每次工作空间运行器触发进程时,我都能读取一次文件b,那就太好了。它是一个静态文件,而且相当大,我有大约17000多个文件要处理,在文件B中加载每一个文件都会消耗大量的时间。
是否可以为工作区运行程序“预加载”文件?我到处找答案,但没看到任何能找到答案的东西。
好。。。我认为这在一定程度上取决于工作区在做什么。你说它“将a中的变量匹配到另一个静态文件,文件b”-这是否意味着属性键上的连接?也许是因为特色合并?有多少功能?A的特征比B的少吗?A中的1000个特征与B中的1000000个特征相匹配?
如果是这样的话,你可以用一个细木工变压器来代替特征合并。你需要将b转换成某种数据库格式,即使只是暂时的,但是你不需要从b读取所有的1000000个特性来匹配其中的1000个。
类似地,您可以使用FeatureReader或SqlExecutor或任何其他可以从数据集B检索所选功能的转换器。所以这是一种技术:读取b的次数相同,但是减少了需要从中读取的数据量。
这是性能的第一定律,顺便说一句。性能被定义为执行的“有用的工作”,因此如果您正在读取未使用的数据,则它不是有用的工作!
无论如何,要只读取B一次,我认为您只需要运行一次工作区,然后一次从所有A文件加载所有数据。基本上是一个大过程。每个文件中有多少个功能?它们是非空间的还是非常复杂的几何?这将是一个大问题。
我假设您已经有了当前的设置—分别读取每个文件—因为组合起来有太多的数据。但如果不是这样,而且您只是将其作为批处理数据的快速方法,那么还有其他解决方案。考虑一次读取所有的A文件,然后在输出上使用数据集扇形展开来再次将它们分割出来。在必要时,变压器中的分组参数可以帮助将每个文件分开。
这是第二种方法:一次读取所有的a文件,所以只需要读取B一次。
最后,这是我的想象力开始超越我的知识,我想知道你是否可以建立一个连续运行的工作空间。该工作区读取文件B,然后一次从所有文件中接收一个特性。只要您将文件A的特性传递给它,它就会一直运行。
我们有这样的变压器- TCPIPReceiver, SQSReceiver,等等。我有些不确定,因为我不知道这样的工作空间如何处理读者。我假设它只读取一次数据,然后——如果您有一个基于组的transformer——保存该数据以便针对任何传入特性进行处理,但我不确定。当然,我也不知道你在执行什么操作,你有多少功能,或者你多久运行一次这个过程(因为这将花费大量的设置,但如果你每天重复这个过程可以节省你很多时间)。
这是第三个技巧:一个连续的过程,它只监听a和B之间的新特性。
还有一些类似的东西,但它们都是相当专业的;例如,如果您正在使用DEM执行某些操作,SurfaceModeller可以将其内部工作方式保存为文件,以便稍后重用。我认为有一些web格式/转换器可以在本地缓存数据,这样您就不必不断地从远程数据源重新读取数据。但我不知道他们会不会帮你。
不管怎样,我希望这里有些东西能帮上忙。如果你能告诉我们更多关于你正在做的事情的细节,那么也许我们可以做些什么来帮助你。除此之外,就像其他人说的,使用一个好的、快速的格式。我似乎记得我曾经尝试过不同的格式,而MicroStation v8是最快的,但我不知道这是否是真的,也不知道我是否把它与FFS进行了比较。
如果我有任何更聪明(甚至不那么聪明)的想法,我会让你知道,
问候
马克
PS:谢谢你让我知道这个布鲁斯。不完全是一个博客,但博客的长度正在增加!
不,你不能,很不幸。
但是您应该考虑文件B的格式,因为一些格式比另一些格式快一个数量级,所以它会产生很大的差异。您可以尝试将文件B预处理为本机FFS格式,看看是否会有所不同。
如果这并不能提高性能,那么可以对工作流进行更全面的分析。亚搏在线例如,如果您在大型数据集上重复使用FeatureMerger,那么您可能会受益于首先将数据加载到关系数据库中,并使用索引字段(作为视图或来自SQLExecutor/SQLCreator)的SQL join查询,这将带来显著的差异。
?2019安全亚搏在线软件公司|法律