代码之家  ›  专栏  ›  技术社区  ›  Fadrian Sudaman

处理大量文本字符串

  •  4
  • Fadrian Sudaman  · 技术社区  · 14 年前

    我的项目在运行时,会在短时间内收集大量的字符串文本块(大约20k个,我见过的最大的大约200k个),并将它们存储在关系数据库中。每个字符串文本都相对较小,平均约为15行(约300个字符)。当前的实现在C(VS2008)、.NET 3.5和后端DBMS中是MS.SQL Server 2005。

    性能和存储都是项目的重要关注点,但优先考虑的是性能,然后是存储。我正在寻找这些问题的答案:

    • 在将文本存储到数据库之前应该压缩它们吗?还是让SQL Server担心压缩存储?
    • 您知道在这个上下文中使用哪种压缩算法/库可以提供最好的性能吗?目前我只在.NET框架中使用标准gzip
    • 你知道处理这个问题的最佳实践吗?我欢迎开箱即用的建议,只要它可以在.NET框架中实现?(这是一个大项目,这个要求只是其中的一小部分)

    编辑:我将继续添加此内容以澄清提出的要点

    • 我不需要对这些文本进行文本索引或搜索。我只需要能够在以后的阶段中检索它们,并使用其主键将其显示为文本块。
    • 我有一个如上所述实现的工作解决方案,SQL Server在处理它时完全没有问题。这个程序将非常频繁地运行,并且需要与大数据上下文一起工作,这样您可以想象大小将非常迅速地增长,因此我所能做的每一个优化都会有所帮助。
    7 回复  |  直到 14 年前
        1
  •  2
  •   Aaronaught    14 年前

    这些字符串平均每个300个字符。这可以是300或600字节,具体取决于Unicode设置。假设您使用 varchar(4000) 列和每个使用(平均)300字节。

    然后在数据库中存储多达200000个。

    存储空间不足60 MB。在数据库领域,坦率地说,就是花生。60 国标 存储是我称之为“中等”的数据库。

    在这个时间点上,甚至 思考 压缩是过早的优化。SQL Server可以在不费吹灰之力的情况下处理这么多的文本。除了您没有提到的任何系统约束之外,我不会关心任何这些问题,直到并且除非您真正开始看到性能问题——即使这样,它也可能是其他问题的结果,比如糟糕的索引策略。

    压缩某些类型的数据,尤其是 小的 数据量(300字节绝对很小)有时会产生更糟糕的结果。最终可能会得到比原始数据大的“压缩”数据。我猜大多数情况下,压缩后的尺寸可能会非常接近原始尺寸。

    SQL Server 2008可以执行页级压缩,这将是一种更有用的优化,但您现在使用的是SQL Server 2005。所以不,绝对不要费心压缩个人 价值观 这是不值得的努力,可能实际上会使事情更糟。

        2
  •  2
  •   Gabe Timothy Khouri    14 年前

    如果您可以升级到SQL Server 2008,我建议您打开页面压缩,如下所示: http://msdn.microsoft.com/en-us/library/cc280449.aspx

    例如,您可以创建这样的压缩表:

    CREATE TABLE T1 
    (c1 int, c2 nvarchar(50) )
    WITH (DATA_COMPRESSION = PAGE);
    

    如果您不能在数据库中使用压缩,很遗憾,您的字符串(不超过300个字符)不值得使用 System.IO.Compression . 不过,我想你可以试试。

        3
  •  1
  •   Rohit    14 年前

    压缩将消耗资源,并且通常会损害性能,其中重要的时间只是本地通信和处理。

        4
  •  1
  •   Jake    14 年前

    不完全清楚你在问什么。

    在性能方面——如果您在将字符串存储到数据库之前压缩内存中的字符串,那么您的程序将比直接将数据填充到表中并稍后让SQL担心的慢。权衡的是,SQL数据库将更大,但1TB硬盘驱动器是便宜的,所以存储真的有那么大的意义吗?

    根据你的数字(20万字节乘以300字节),你只说大约60英里。这不是一个很大的数据集。您是否考虑过在ADO.NET中使用大容量复制功能?( http://msdn.microsoft.com/en-us/library/7ek5da1a.aspx )如果所有的数据都放在一张表中,这应该很有趣。

    这将是一种替代方法,可以使用类似ef这样的工具生成基本上200K的insert语句。

    更新 下面是另一个例子: http://weblogs.sqlteam.com/mladenp/archive/2006/08/26/11368.aspx

        5
  •  0
  •   kemiller2002    14 年前

    我不担心压缩它们。对于这种大小的字符串(大约300个字符),这将是一个比它的价值更令人头痛的问题。压缩字符串需要时间(不管有多小),而且SQL Server 2005没有一种本地的方法来完成这项工作,这意味着您需要编写一些东西来完成这项工作。如果在会影响性能的应用程序中执行此操作,可以在数据库中编写一个clr例程来执行此操作,但在应用程序中实际使用压缩字符串(或任何其他使用压缩字符串的方法)仍然是一个额外的步骤。

    数据库中的空间很便宜,所以压缩所有字符串并不能真正节省很多空间。最大的问题是在应用程序的内存中保留大量的字符串。如果您经常返回数据库加载其中的一些内容,而不同时尝试缓存所有内容,那么除非您实际看到问题,否则我不会担心这一点。

        6
  •  0
  •   Chris Ballance    14 年前

    听起来你会受益于使用 Large-Value Data Types

    这些数据类型最多可存储2^31-1字节的数据

    如果你所有的弦都很小,那么通过压缩它们可以获得一个递减的回报。如果没有natuve-sql压缩,那么如果您压缩它们,它们将不可搜索。

        7
  •  0
  •   Stephan Eggermont    14 年前

    听起来您好像在试图用关系数据库解决一个绝对非关系的问题。为什么要使用数据库?当然可以,但有些问题并不适合。TFS表明,只要在RDB上投入足够的硬件,就可以强行使用它,但这并不能使它成为一个好主意。