代码之家  ›  专栏  ›  技术社区  ›  kurczak

用于处理海量数据的库/数据结构

  •  14
  • kurczak  · 技术社区  · 15 年前

    我有一些巨大的二进制驱动程序日志(每个日志大约2-5GB,在将它们转换成可读形式后可能是原来的10倍左右),我需要编写一个工具,允许我依次浏览、排序、搜索和有效过滤它们(以便找到并解决bug)。

    每个日志条目都有一些属性,比如:时间戳、类型、消息和一些guid。条目是同质的,没有关系,不需要存储“检查”后的数据。

    我真的不知道怎么处理这么多数据。将所有内容都保存在内存中是愚蠢的,将数据保存在平面文件中也是如此。我曾想过使用像SQLite这样的小型DBMS,但我不确定它是否足够快,而且我不需要DMBS的许多特性—只需要排序和搜索。在这种情况下,如果可能的话,我会迫不及待地用空间换取速度。

    是否有任何库(或者数据结构)可以帮助我处理如此大量的数据?

    编辑: 哦,有人知道SQLite的“:memory”模式是否对DB的大小有任何限制,或者它是否只会填充虚拟内存直到完全填满它?

    9 回复  |  直到 15 年前
        1
  •  13
  •   Lior Kogan    15 年前

    STXXL -超大数据集的标准模板库。

    “STXXL的核心是实现外部存储器(非核心)计算的C++标准模板库STL的实现,即,STXXL实现容器和算法,这些容器和算法可以处理只适用于磁盘的大量数据。虽然与STL的兼容性支持易用性和与现有应用程序的兼容性,但另一个设计重点是高性能。”

    另外,如果您可以将多台计算机用于此任务,请选中 Hadoop . 尤其是HBase、Hive和MapReduce。

        2
  •  6
  •   Reed Copsey    15 年前

    SQLite可以很好地解决这个问题,尽管非关系数据存储可能会占用较少的空间。但是,如果您想搜索多个“条目”,DB绝对是一个不错的选择。

        3
  •  5
  •   Robert Christie    15 年前

    这个 HDF5 文件格式和相关的库被设计用来存储大量的数据,并允许对其进行快速有效的I/O。

    这个 pytables project提供了一种从python使用它们的好方法,并提供了排序和搜索的方法。

        4
  •  3
  •   Community Mohan Dere    9 年前

    使用某种内存映射的I/O,比如Java,怎么样 MappedByteBuffer 把你自己的工具卷起来?

    从某某的答案转述 MBBs ,

    您可以为每个日志文件创建这样的文件来读取它们。需要注意的是,您应该使用64位,因为这会给您的文件提供TB限制,而不是GBs。

    浏览、筛选和排序 在处理mbb时,只需在某些层次结构中显示文件并使用文件名或时间戳之类的度量来对它们进行排序,就可以用自己的代码实现。你的筛选标准是什么?

    搜索

    性能提示 this 网站很棒。

        5
  •  2
  •   Yuval    15 年前

    Hadoop 或者类似的东西。除了理论上的介绍,我还没有机会使用Hadoop,但它似乎很有希望。

    另一种方法是使用商业工具,比如 Splunk

        6
  •  2
  •   Mike    15 年前

        7
  •  1
  •   Steve314    15 年前

    一种选择可能是 Berkeley DB ,或类似的可嵌入数据库管理器。

    我没有使用过Berkely DB,但从快速查看来看,我猜它类似于许多年前的ISAM数据库管理器—基本上是一个用于处理磁盘密钥的库—>数据索引数据结构。唯一值得注意的是,我看到有人提到了哈希表,所以它可能无法完成ISAM的顺序部分,但我希望它能做到——最新版本甚至支持SQL。

    您不一定需要将完整的二进制日志转换为可读的形式。可以进行初始索引构建扫描,将偏移量保存到原始文件中。一个有用的索引可能只是从行号到字节范围,因此您可以快速显示特定的行范围—当然,只有在日志记录长度可变的情况下。

    如果是这样的话 Btrieve (我几年前用过一段时间),应该很简单。

        8
  •  0
  •   nicomen    15 年前

    你没有说语言。因此,只要提供一个模块,允许您以一种高效的方式对文件进行随机访问: http://perldoc.perl.org/Tie/File.html

        9
  •  0
  •   WOPR    15 年前

    “时间戳,类型,消息,一些guid。条目是同质的,没有关系,不需要存储“检查”后的数据

    您是否考虑过将离散条目作为单独的文件存储在一个目录中?

    最棒的是,api内置在操作系统中。

    ..

    显然,如果您需要比这更灵活的东西,那么您将需要一个合适的DB,但它可能会根据您的需求而工作。