【问题标题】:Efficient way to analyze large amounts of data?分析大量数据的有效方法?
【发布时间】:2011-01-21 22:07:18
【问题描述】:

我需要分析数万行数据。数据是从文本文件中导入的。每行数据有八个变量。目前,我使用一个类来定义数据结构。在阅读文本文件时,我将每个行对象存储在一个通用列表 List 中。

我想知道是否应该改用关系数据库 (SQL),因为我需要分析每一行文本中的数据,试图将其与我目前也存储在通用列表 (List) 中的定义术语相关联.

目标是使用定义翻译大量数据。我希望定义的数据是可过滤的、可搜索的等。使用数据库越想越有意义,但我想在进行更改之前与更有经验的开发人员再次确认(我使用的是结构和首先是数组列表)。

我能想到的唯一缺点是,数据在用户翻译和查看后不需要保留。不需要永久存储数据,因此使用数据库可能有点矫枉过正。

【问题讨论】:

    标签: c# sql data-structures list data-analysis


    【解决方案1】:

    去数据库不是绝对必要的。这取决于数据的实际大小和您需要执行的过程。如果您使用自定义类将数据加载到 List 中,为什么不使用 Linq 进行查询和过滤呢?比如:

    var query = from foo in List<Foo>
                where foo.Prop = criteriaVar
                select foo;
    

    真正的问题是数据是否太大以至于无法舒适地加载到内存中。如果是这样的话,那么是的,数据库会简单得多。

    【讨论】:

    • 我正在导入的文件往往包含数万行,有些甚至超过 10 万行。每行有八个需要分析和翻译的字段。例如,一个字段可能包含值“phy”,需要根据定义文件转换为“物理层”。我正在尝试找出分析和翻译这些数据的最有效方法。
    • 您是要对数据进行聚合分析还是仅逐行处理?如果是后者,那么与尝试将数据导入 SQL Express 或 Access 相比,读取文本文件并进行处理可能会非常快。尽管如此,将它放入数据库会给您带来一定程度的灵活性,例如能够创建您必须自己编码的索引。
    • 我认为我别无选择,只能进行聚合分析,因为某些定义取决于文本文件中的先前行。此外,通过聚合分析,我可以重组数据以使其更具可读性/更易于理解。即使我要即时处理,我仍然需要一个数据结构,以便用户可以过滤/搜索数据。
    • 我想这取决于您是想从集合的角度还是迭代地分析数据。如果你想成组分析它,那么数据库就是你要走的路。如果您想迭代地分析它,您可能仍然考虑在代码中进行。但是,请注意您使用的 DMBS。如果您使用 Access,您将无法在 SQL 查询中获得与使用 SQL Server 相同程度的灵活性。如果您可以访问目标本地网络上的 SQL Server,最简单的解决方案可能是在其上使用数据库并在完成后删除您的表。
    • 如果我决定放弃数据库,将类定义的对象存储在 List 中是最有效的迭代方式吗?
    【解决方案2】:

    这不是大量的数据。我认为没有任何理由在您的分析中涉及数据库。

    C# 中内置了一种查询语言——LINQ。原始海报目前使用对象列表,因此真的无事可做。在我看来,这种情况下的数据库会增加热量而不是光线。

    【讨论】:

    • 对于查询语言,这样就不用硬编码(或者自己发明)?
    • @jeffamaphone - C# 内置了一种查询语言——LINQ。原始海报目前使用对象列表,因此真的无事可做。在我看来,这种情况下的数据库会增加热量而不是光线。
    【解决方案3】:

    听起来你想要的是一个数据库。 Sqlite supports 内存数据库(使用 ":memory:" 作为文件名)。我怀疑其他人可能也有内存模式。

    【讨论】:

    • 这听起来是一个非常有吸引力的解决方案。我对内存数据库不是很熟悉,所以我必须进行研究,但 Sqlite 听起来像是一个轻量级系统(从名称来看)。
    • SQLite 尽管大肆宣传,但并不能很好地处理数百万的数据。几万,我不知道,这取决于。确保正确索引它。尝试较大的页面大小。如果您以某种方式怀疑它可能会增长到更多数据,请不要使用 SQLite!我从经验中知道。
    • 是的,它很精简,而且你得到你所支付的。我已经用它来做一些小事情,有些事情有几十万。此外,它并不是真正的线程安全。
    【解决方案4】:

    当我在以前的公司工作时,我遇到了与您现在遇到的同样的问题。问题是我正在为大量生成条形码的文件寻找一个具体而好的解决方案。条形码生成一个文本文件在一个文件中包含数千条记录。起初操作和呈现数据对我来说非常困难。根据我编程的记录,我创建了一个类来读取文件并将数据加载到数据表中,并且能够将其保存在数据库中。我使用的数据库是SQL server 2005。然后我可以轻松管理保存的数据并以我喜欢的方式呈现它。要点是从文件中读取数据并将其保存到数据库中。如果你这样做因此,您将有很多选择来以您喜欢的方式进行操作和呈现。

    【讨论】:

      【解决方案5】:

      如果您不介意使用访问权限,您可以这样做

      附加一个空白的 Access db 作为资源 需要时,将数据库写入文件。 运行处理数据列的 CREATE TABLE 语句 将数据导入新表 使用 sql 运行您的计算 OnClose,删除那个访问数据库。

      您可以使用 Resourcer 之类的程序将 db 加载到 resx 文件中

        ResourceManager res = new ResourceManager( "MyProject.blank_db", this.GetType().Assembly );
        byte[] b = (byte[])res.GetObject( "access.blank" );
      

      然后使用以下代码将资源拉出项目。获取字节数组并使用临时文件名将其保存到临时位置

      “MyProject.blank_db”是资源文件的位置和名称 “access.blank”是给资源保存的标签

      【讨论】:

      • 顺便说一句,同样的事情也适用于 Visual Studio 2008 附带的 SQL Server Compact Edition。
      • 我想我宁愿使用内存中的 SQL 解决方案,但我必须做我的研究。
      【解决方案6】:

      如果您唯一需要做的就是搜索和替换,您可以考虑使用 sed 和 awk,并且可以使用 grep 进行搜索。当然是在 Unix 平台上。

      【讨论】:

      • 在 Windows 上,msys 和 cygwin 可以给你 sed 和 awk。
      【解决方案7】:

      根据您的描述,我认为 linux 命令行工具可以很好地处理您的数据。使用数据库可能会不必要地使您的工作复杂化。如果您使用的是 Windows,这些工具也可以通过不同的方式获得。我会推荐cygwin。以下工具可能涵盖您的任务:sort、grep、cut、awk、sed、join、paste。

      这些 un​​ix/linux 命令行工具对于 Windows 用户来说可能看起来很吓人,但人们喜欢它们是有原因的。以下是我爱他们的理由:

      1. 它们可以让您积累技能 - 您对部分工具的了解可能会在未来的不同任务中有所帮助。
      2. 它们可以让您的努力不断积累 - 用于完成任务的命令行(或脚本)可以根据需要使用不同的数据重复多次,无需人工干预。
      3. 它们的性能通常优于您可以编写的相同工具。如果您不相信,请尝试使用您的版本对 TB 文件进行排序。

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        相关资源
        最近更新 更多