F#与“企业级”报告

36

基于您的实际经验、白皮书或其他可参考的研究,F# 目前是否是企业级报告的可行工具?

注意:在将此问题投票关闭为“不具有建设性”之前,请阅读底部说明。

背景
我目前在一家大型企业工作,在许多不同的报告工具中广泛使用,包括(但远非局限于)SAS、Cognos、SSRS,甚至还有一些 COBOL。每种工具都有其适当的位置,其中许多在大多数方面都具有相同的功能集等。我们的大多数工具都能够相对容易地输出到 PDF、Excel 和数据库中,并在这些情况下表现出色。

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

尽管上述报道技术非常出色,但在高级 ETL 方面从或到电子表格时,它们效果不佳。它们并没有为此而设计,虽然它们在将报告格式化为 Excel 电子表格方面非常熟练,但在更新现有电子表格或以某些非常特定的方式提取数据方面并不是很好(例如仅提取红色突出显示的值)。因此,我们最终编写了许多 .NET 控制台应用程序来完成这一点。(同样-不感兴趣地辩论这个方法,它就是这样。我知道-我也不喜欢它。)

.NET 是我认为非常棒的框架,足够灵活,可以处理几乎任何编程任务,所以我们理论上可以在 .NET 中处理所有报告。但是-尝试在 .NET 中处理所有报告需要太长时间。我们必须自己编写所有样板文件。我喜欢利用我们已经拥有的实际报告工具的强大、简单和健壮性。

因此,我们最终需要编写两个应用程序来完成一个任务 - 例如,使用SAS作业从多个数据源加载数据,执行转换并将结果存储在永久或临时位置,以及第二个.NET作业将结果加载到电子表格中。(我知道。) 要点
过去几年中,我一直在看和听关于F#的很多东西,我自己也涉猎了一些。我在大学学过OCAML,我喜欢函数式编程。当需要时,我乐意在一个平台上(如果不是一个语言),为特定报告做所有的编程。然而,问题在于F#语言和.NET框架是否已经完全准备好用于企业级报告 - 我说的是必须准确高效地运行的报告。微软肯定在大力推销它,但我想知道有没有使用其他报告技术经验的人在实际生产环境中尝试过它。它与其他报告技术相比如何?它是否可以轻松集成到企业环境中?您如何处理安全性?正确完成后,F#需要什么样的内存配置文件(我们谈论的是数百万条记录)?它能够很好地处理表格数据吗?它是否高效?维护它有多容易(特别是如果代码越来越多)?需要哪些第三方附加组件、插件等才能使其正常工作(或者它可以基本上完成所有工作)?相比其他报告系统(获得类似结果),需要多少工作(编程小时数等)?
如果您没有F#的经验,或者只使用F#,那么我对您的意见不是特别感兴趣 - 我想听听那些实际上已经填补了这个差距并且可以从经验中提出关于在大数据(数百万条记录,输出到各种格式)中使用F#作为报告引擎的机会和陷阱的人的意见。
我看到有一些问题已经涵盖了一些内容:
  • F#(或.NET库)的统计功能
  • 您使用Matlab/F#/R进行数据分析和建模算法的经验
  • 但它们是几年前的问题。几个版本之后,F#是否胜任此任务?还是我在朝错误的方向努力?

    编辑

    仅为澄清起见,我特别关注F#的新信息丰富的编程。在 F# 3.0之前,它只是一项有趣的技术,但 F#'s 最近增加的能力使用数据库类型提供程序和查询表达式使其看起来像是其他报告撰写技术的可行替代品。微软确实在暗示

    一个可接受的答案将包含第一手经验的描述(或对记录的案例研究的引用),以在F#中构建企业级报告引擎并与其他报告技术进行比较,涉及性能增益或损失等方面。它不必太详细 - 只需要足够说服一个普通(称职)的经理,F#对于批量数据处理是一个合适/不合适的技术。 是否已经完成?谁做到了?结果如何?相对于类似技术,实施有多复杂?它表现如何?


    为什么我会提出主观问题?
    像大多数优秀的stackoverflow成员一样,我经常投票关闭主观问题。根据FAQ,应该避免主观问题,但并没有完全禁止。该FAQ链接到六个关于好的主观问题的指导方针,我已尝试遵循这些指南。请在投票关闭此问题之前阅读这些指南。


    3
    除此之外,我不确定什么样的答案才是可接受的。使用.NET,您可以构建任何您想要的东西,并且只要付出足够的努力,所有问题(内存、可扩展性等)都可以得到解决。将.NET与某个报告工具进行比较,就像将建筑材料与房子进行比较。 - Daniel
    @Daniel - F#与C#完全不同。仅仅因为它们都在.NET平台上运行,就说它们是相同的,就像所有Windows应用程序都是相同的一样,因为它们在同一个操作系统上运行。它们显然是针对不同任务的——问题是F#是否足够成熟,可以替代其他技术,比如SAS。我想知道是否有人成功地这么做了,以及他们遇到了什么问题。 - JDB
    3
    你正在比较不同的事物。F#不是查询语言、数据库或分析引擎等,而是一种通用编程语言。只要投入足够的努力,你可以使用它构建任何你想要的东西。 - Daniel
    @Daniel - 在3.0版本中,它似乎成为了一种查询语言,具有“信息丰富的编程”特性。2.0不是很有趣,但是3.0则很吸引人。 - JDB
    3
    被5名从未接触过F#标签的用户关闭,没有任何评论。 - Benjol
    显示剩余8条评论
    6个回答

    28
    "与其他报告技术相比,它如何?是否可以轻松集成到企业环境中?"
    "我不知道F#与其他报告技术相比如何,但我已将其部署在多个企业环境中,基本上与C#相同,即易于使用和稳健。"
    "您是如何解决安全问题的?"
    "与C#相同。"
    "如果正确操作,F#需要什么样的内存配置文件(我们正在谈论数百万条记录)?"
    "在5年的使用中,我发现.NET中有一个GC bug,它并非特定于F#。我遇到了一些大对象的问题(同样不是F#特定的),但总体而言,GC强大而高效,并且会积极进行回收。"
    "我处理了数十亿条记录,发现F#非常快速且非常可靠。请注意,F#用于Microsoft的Bing AdCenter(用于广告放置)和Microsoft的Halo 3,两者都需要处理TB级数据集。"
    "它能很好地处理表格数据吗?"
    Yes,您可以轻松地实现并行处理(请参见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#代码为他们编写了一个定制的商业规则引擎演示。我无法用其他任何工具完成这项工作。

    5
    "...但是与其他工具相比,它的主要优势在于操作像树和图这样的结构化数据。" 在过去的一年中,我已经阅读并关注了您关于 F# 的大部分评论(以及争论)。我从未发现它们有任何错误。这句引语也不例外。我们公司曾使用 VoltDB 计算某些匹配项。我使用 F# 中的内存 Trie 结构完全重写了整个模块。即使对于复杂查询,我的 800 行 F# 代码也轻松击败了 VoltDB 的速度。不,我的 F# 不是在执行 VoltDB 操作的逻辑子集。编辑:我的 Trie 大约有 3.2x10^6 个节点。 - Shredderroy

    26

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

    编辑;

    当然;我用内存数据和一个全新的查询引擎将我的一个客户的Infobright数据库替换为F#。它将10GB以上的数据查询时间从30分钟降至100毫秒左右。整个过程只花了我6个小时去构建,只有几百行代码。该数据库是支持基于Web的报告服务的后端,在升级后变得非常响应。

    在eBay期间,我使用R来处理我的大数据(批量)后处理。基本的平面文件大小达到了十几GB,所以它们太大了,Excel无法处理。R在聚合过程中进行了大量不必要的内存分配;10GB会变成40GB,并且一旦开始访问页面文件就会停滞不前。根据数据的不同,可能需要几分钟、几个小时或永远无法完成。有付费的R库可以解决这个问题,但它们在其他方面的限制很大。在F#中进行聚合将这个问题降至100毫秒,同时保持常量空间。这些聚合只有几十行代码,与R大致相同,但易于理解并经过类型检查。因为一个打字错误导致R作业在处理了一个小时后失败是令人非常愤怒的。

    我曾经使用过OLAP立方体(例如Microsoft分析服务),但这些系统已经被大数据集群和大内存机器完全取代。现在使用F#和.net 4.5中的新垃圾收集器很容易构建自己的大内存机器。

    希望能帮到您。

    7
    我很想看看你嵌入式的 F# IDE!这可能会成为一篇非常棒的博客文章! - Robert Jeppesen
    嗨,弗拉德,最好给我发一封电子邮件,我的个人资料上是否可见? - moloneymb
    @moloneymb - 不,电子邮件地址在个人资料中不可见。建议您使用聊天功能与Stack Overflow成员联系。如果您有要广告的服务,可以将相关信息添加到您的个人资料中的“关于我”部分(包括电子邮件地址),但请注意它对所有人都可见。 - JDB
    大家好,我已经在关于我的部分添加了我的联系方式。随时可以通过电子邮件/ Skype 联系我。谢谢 - Matt - moloneymb
    您现在可以在 http://www.youtube.com/watch?v=XsNa2LbIdFA 观看Excel编辑器的工作状态了。 - moloneymb
    显示剩余4条评论

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

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


    前两篇论文并不是真正的主题,但第三篇很有用。为此点赞,尽管我真的在寻找第一手经验(或至少是由微软或其合作伙伴之外的人发表的论文)。 - JDB

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

    Excel自动化是其中一个例子。我刚刚与同事讨论的另一个例子是交互性。我们不能在每个业务用户的机器上安装SAS,而Cognos和SSRS只允许有限的交互性。F#没有这样的限制。但同样,我知道F#的理论优势 - 但有人真正在他们的环境中使其发挥作用了吗?(另外,我知道,我知道,我知道 - Excel是一个可怕的报告平台。但当您从国家接收必须用5000个数据点填充的Excel“模板”时,您无能为力。) - JDB

    1
    我曾经测试过F#对包含890,000条记录(500mb)的制表符分隔文本文件进行聚合,大约需要20秒。在新硬件上使用Win8和.Net 4.5应该会更快。我认为它相当快。
    不确定您的报告要求是什么,但请查看SQL Server Analysis Services(SSAS)和Reporting Services。
    SSAS现在配备了一个内存中的“表格”引擎。我最近使用10亿行进行了测试。Excel数据透视表查询聚合超过10亿行只需要大约2秒钟。

    我主要对F#感兴趣。我们已经使用各种报告平台和技术(包括SSRS和SSIS)。 - JDB

    -1

    虽然有些离题,但您可能希望使用其他工具(如XLReport或其更大的表兄弟DBxtra)自动化您的Excel工作流程。这两个工具都可以从Excel文件中读取数据,基于它们进行查询,并手动或在DBxtra的情况下自动导出结果。两者的好处是,如果Excel文件的结构不发生变化,您只需要设计一次查询即可。


    我很感激这些信息,但我希望在这个问题上得到的答案能保持话题相关(否则它很快就会失控)。我们已经自动化了Excel工作流程 - 这就是.NET应用程序所做的。 (如果您不同意并认为这对这个问题有用,则可以轻松删除回答以恢复您的声誉,或让其保留。) - JDB

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接