36

根据您的实际经验白皮书或其他受人尊敬的可参考研究,F# 目前是否是企业级/企业级报告的可行工具?

注意:在投票以“非建设性”结束此问题之前,请阅读底部的内容。

背景
我目前在一家大型公司工作,该公司大量使用许多不同的报告工具,包括(但不限于)SAS、Cognos、SSRS,甚至还有少量的 COBOL。每个工具都有其应有的地位,其中许多工具在大多数方面在功能集等方面是等效的。我们的大多数工具都能够相对轻松地输出到 PDF、Excel 和数据库,并且在这些情况下工作得非常好。

不幸的是,我的组织和许多人一样,使用 Excel 电子表格,无论喜欢还是讨厌它,我们都花了很多时间编写 .NET 控制台应用程序,以便从 Excel 电子表格中提取信息并将信息插入到 Excel 电子表格中。(我对争论这种方法的优点或缺点不感兴趣。它就是这样,我无法改变它。)

与上面列出的报告技术一样出色,但当涉及到电子表格的高级 ETL 时,它们却是平淡无奇。它们只是不是为此而设计的,虽然它们非常擅长将报告格式化为 Excel 电子表格,但它们并不擅长更新现有电子表格或以某种非常特定的方式提取数据(仅提取以红色突出显示的值,例如)。因此,我们最终编写了大量 .NET 控制台应用程序来完成这一点。(再一次 - 对辩论这种方法不感兴趣。它就是这样。我知道 - 我也不喜欢它。)

在我看来,.NET 是一个出色的框架,并且足够灵活,可以处理几乎所有的编程任务,因此理论上我们可以处理 .NET 中的所有报告。但是 - 尝试处理 .NET 中的所有报告需要很长时间。我们必须自己编写所有样板文件。我喜欢利用我们已经拥有的实际报告工具的强大功能、简单性和稳健性。

因此,我们最终为单个任务编写了两个应用程序 - 例如,一个 SAS 作业从多个数据源加载数据,进行转换并将结果存储在永久或临时位置,以及另一个 .NET 作业执行结果并将它们加载到电子表格中。(我知道。)


在过去的几年里我看到和听到了很多关于 F# 的观点,我自己也涉足了一点我在大学学习了 OCAML,我喜欢函数式编程。当需要时,我很乐意在单一平台(如果不是单一语言)上完成特定报告的所有编程。不过,问题是 F# 语言和 .NET 框架是否已为企业级报告做好充分准备——我说的是必须准确有效地运行的报告。微软肯定在卖力,但我想知道是否有人在其他报告技术方面有经验,是否真的在生产环境中尝试过。它与其他报告技术相比如何?能否轻松集成到企业环境中?你是如何解决安全问题的?做得对,F# 需要什么样的内存配置文件(我们说的是数百万条记录)?它能很好地处理表格数据吗?它有效率吗?维护起来有多容易(尤其是在代码增长的情况下)?需要什么样的第三方附加组件、插件等才能使某些东西正常工作(或者它可以开箱即用地完成大部分工作)?与其他报告系统(类似结果)相比,需要多少工作(编程时间等)?

如果您没有使用 F# 的经验,或者如果您只使用 F#,那么我对您的意见并不特别感兴趣 - 我想听听那些实际上已经弥合了差距并且可以从经验中联系到机会和将 F# 用作大数据(数百万条记录,输出为各种格式)的报告引擎的缺陷。

我已经看到了一些已经涵盖了其中一些领域的问题:

但他们已经几岁了。之后的几个版本,F# 能胜任吗?还是我是一只在错误的树上吠叫的狗?

编辑

只是为了清楚起见,我对 F# 的新的信息丰富的编程特别感兴趣。在 F# 3.0 之前,它只是一项有趣的技术,但 F#最近添加的使用数据库类型提供程序及其查询表达式的功能使其看起来像是其他报表创作技术的可行替代方案。微软当然暗示它是

一个可接受的答案将包含实施 F# 中内置的企业级报告引擎的第一手资料(或对文档案例研究的参考),以及与其他报告技术的任何性能增益或损失等的比较。它没有不必太详细 - 足以让普通(称职的)经理相信 F# 是适合/不适合批量/批量数据处理的技术。已经完成了吗?谁干的?结果如何?实现有多复杂(相对于类似技术)?它表现良好吗?


为什么我要问一个主观的问题?
像大多数优秀的 stackoverflow 成员一样,我经常投票关闭主观问题。根据常见问题解答,应该避免主观问题,但不能完全禁止。常见问题解答链接到我试图遵循的关于重大主观问题的六个指南。请在投票结束此问题之前阅读这些指南。

4

6 回答 6

28

它与其他报告技术相比如何?能否轻松集成到企业环境中?

我不知道 F# 与其他报告技术相比如何,但我已经将它部署在多个企业环境中,它与 C# 基本相同,即简单且健壮。

你是如何解决安全问题的?

与 C# 相同。

做得对,F# 需要什么样的内存配置文件(我们说的是数百万条记录)?

在 5 年的使用中,我在 .NET 中发现了一个 GC 错误,它并非特定于 F#。我在处理大型对象时遇到了几个问题(同样,不是特定于 F#),但总的来说,GC 是健壮和高效的,并且可以积极地收集。

我处理了数十亿条记录,发现 F# 非常快速且非常可靠。请注意,F# 用于 Microsoft 的 Bing AdCenter(用于广告投放)和 Microsoft 的 Halo 3,两者都需要处理 TB 数据集。

它能很好地处理表格数据吗?

是的,你有简单的并行性(见Array.Parallel模块),但它相对于其他工具的主要优势在于操纵结构化数据,如树和图表。

它有效率吗?

是的。

我们当前的客户是世界上最大的保险公司之一,从 C++ 到 F# 的转换实现了 10 倍的性能提升(代码大小减少了 10 倍)。

以前的客户看到将编译器从 OCaml 迁移到 F# 时性能得到了改进。这令人印象深刻,因为 OCaml 是专门为编写编译器而设计的,而且速度非常快。

一位前客户让我们重写他们的交易平台,即使我们从非 GC C++ 迁移到 GC'd F#,我们也看到了 100 倍的吞吐量和延迟改进。

维护起来有多容易(尤其是在代码增长的情况下)?

易于维护。在 ML 中,添加函数是一件轻而易举的事,当您扩展联合类型时,静态类型系统捕获会为您提供大量反馈。

我们当前的客户在去年 4 月上线了他们的第一个 F# 代码,尽管根本没有接受过任何 F#(或 OCaml)培训,但它的维护者没有遇到任何问题。

需要什么样的第三方附加组件、插件等才能使某些东西正常工作(或者它可以开箱即用地完成大部分工作)?

我们从未使用过任何(但我们卖了两个!)。我考虑过的唯一第三方是 WPF 控件,它们同样不是 F# 特定的。

与其他报告系统(类似结果)相比,需要多少工作(编程时间等)?

不知道,对不起。看起来我们已经完成了 Dialogue 和 HP Extreme 的一些工作,所以我很快就会发现...

实现有多复杂(相对于类似技术)?

F# 代码比 C++、C# 和 Java 等较早的主流语言简单得多。

我想强调的是,当您使用 F# 来解决使用更传统工具无法解决的过于复杂的问题时,它确实会带来好处,而不仅仅是在 F# 中重写旧代码。

例如,我们当前的客户一直在使用一个业务规则引擎,他们花了大约 1,000,000 英镑购买,但它并没有解决他们的业务问题(与大桌子的斗争,与数学的斗争)所以我给他们写了一个定制业务的演示一周内大约 1,000 行 F# 代码中的规则引擎。我无法用任何其他工具做到这一点。

于 2013-02-01T00:40:30.593 回答
26

回答你的问题——你在正确的轨道上。我这样说是作为一个建立了许多报告和大数据系统的人。我用 Scala 和 R 构建了 eBay 使用的大数据分析平台之一。最近,我为 MSRC 构建了 Hadoop / Hive F# 类型提供程序。我可以说没有什么比 F# .net 堆栈更能达到这个目的了。出色的性能、易于使用的本机互操作、大量库、REPL、类型提供程序、用于图表的 WPF。自 MSRC 以来,我一直在构建一个功能齐全的 F# IDE,它可以嵌入到 Excel 中,您可以在其中使用类型提供程序与带有 Intelisense 的工作簿进行交互。如果你想看,给我发电子邮件。

编辑;

当然; 我使用内存数据和从头开始的查询引擎用 F# 替换了我的一个客户 Infobright 数据库。它将 10 GB 数据的查询时间从 30 分钟减少到 100 毫秒。整个过程花了我 6 个小时来构建,并且只有几百行代码。该数据库是基于 Web 的报告服务的后端,在升级后该服务变得更加灵敏。

在 eBay 时,我曾经在 R 中进行大数据(批量/批量)后处理。基本的平面文件是 10 GB,所以它们对于 Excel 来说太大了。R 在聚合过程中进行了大量不必要的内存分配;10GB 将变为 40GB,一旦开始访问页面文件,就会停止爬行。根据数据,它可能需要几分钟、几小时或永远不会完成。有付费的 R 库可以解决此问题,但它们在其他方面受到限制。在 F# 中进行聚合可以将其缩短到 100 毫秒且具有恒定空间。这些聚合是 10 行代码,与 R 大致相同,但更容易理解并且经过类型检查。由于拼写错误,R 作业在处理一个小时后失败是令人愤怒的。

我曾经使用 OLAP 多维数据集(例如 Microsoft Analysis Services),但这些系统已经完全被大数据集群和大内存机器所取代。现在可以很容易地使用 F# 和 .net 4.5 中的新垃圾收集器构建您自己的大内存机器。

希望有帮助。

于 2013-01-31T21:30:47.190 回答
5

我不确定这有多大帮助,但微软网站上有一些关于 F# 的白皮书。我在下面链接的第一个特别提到了统计处理/数据库,因此它可能是三者中最有用的。

还有一个用于 F# 的 R 类型提供程序,这使得 F# 和 R 之间的互操作变得容易。

于 2013-01-31T16:12:52.963 回答
3

如果您希望创建一个“具有更好的 Excel 自动化的企业级报告系统”,我认为您正在寻找正确的树(即它是可行的),但是树上有一只熊(不是松鼠)。换句话说,它很少是值得的。现在,也许你的情况是个例外。非常需要需要非常措施。但是,我想知道是否有某种方法可以抽象出您的报告系统无法完成的部分内容,并专注于提高互操作性......而不是从头开始构建所有内容。我认为,正确的方法很大程度上取决于细节,你最了解这些细节,而且我想这些细节太多了,无法在此一一列举。

于 2013-01-31T19:26:39.453 回答
1

我曾经测试过 F# 在大约 20 秒内聚合一个包含 890,000 条记录 (500mb) 的制表符分隔的文本文件。在带有 Win8 和 .Net 4.5 的较新硬件上,它应该会更快。我认为它相当快。

不确定您的报告要求是什么,但请查看 SQL Server Analysis Services (SSAS) 和 Reporting Services。

SSAS 现在带有一个内存中的“表格”引擎。我最近用 10 亿行测试了它。聚合超过 10 亿行的 Excel 数据透视表查询在大约 2 秒内发生。

于 2013-02-01T01:17:56.993 回答
-1

题外话,但您可能希望使用其他工具(例如XLReport或其更大的表亲DBxtra )稍微自动化您的 Excel 工作流程,它们都可以从 Excel 文件中读取,基于它们进行查询,并手动导出结果,或者在 DBxtra 的情况下自动,两者的好处是,如果 Excel 文件的结构没有改变,您只需要设计一次查询。

于 2013-02-01T16:20:10.327 回答