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

Algorithm 用于处理海量数据的库/数据结构,algorithm,language-agnostic,data-structures,Algorithm,Language Agnostic,Data Structures,我有一些巨大的二进制驱动程序日志(每个日志大约2-5GB,在将它们转换为可读形式后,可能会增加10倍左右),我需要编写一个工具,允许我按顺序浏览、排序、搜索和有效过滤它们(以便发现和解决bug) 每个日志条目都有几个属性,如:时间戳、类型、消息和一些guid。条目是同质的,没有关系,在“检查”数据后不需要存储数据 我真的不知道如何处理这么多数据。将所有内容都保存在内存中是愚蠢的,将数据保存在平面文件中也是如此。我曾想过使用像SQLite这样的小型DBMS,但我不确定它是否足够快,而且我不需要DM

我有一些巨大的二进制驱动程序日志(每个日志大约2-5GB,在将它们转换为可读形式后,可能会增加10倍左右),我需要编写一个工具,允许我按顺序浏览、排序、搜索和有效过滤它们(以便发现和解决bug)

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

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

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

像Postgre、MSSQL、MySQL这样的“已服务”RDBMS是不可能的,该工具应该易于在任何地方使用,而不会带来任何麻烦

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

我认为将其存储在DBMS中是合适的方法。排序和搜索是DB的excel擅长执行的任务——有了这么多的数据,使用为此目的设计的工具将是一个巨大的优势

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

签出-超大数据集的标准模板库

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


此外,如果您可以将多台计算机专用于此任务,请检查。尤其是HBase、Hive和MapReduce。

我建议使用MapReduce的一些实现,或者类似的实现。除了理论上的介绍,我还没有机会使用Hadoop,但它似乎很有希望


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

使用某种内存映射I/O,比如Java,然后使用自己的工具怎么样

从这样一个答案中进行解释

基本上,这种机制使用操作系统的虚拟内存分页系统来“映射”文件,并以字节缓冲区的形式编程呈现它们。操作系统将自动、非常快速地管理从磁盘和内存到/到磁盘和内存的字节移动

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

浏览、筛选和排序 在处理MBB时,只需在某些层次结构中显示文件,并使用文件名或时间戳等指标对其进行排序,这对于您自己的代码来说应该很简单。你的筛选标准是什么

搜索 现在,如果你想搜索它们,运行在上面的Lucene会给你一个很好的索引文件的方法。您也可以采用多种方法—使用hadoop和Map/Reduce,正如其他人提到的那样,在多台机器上分发任务

网站上的性能提示非常棒。

文件格式和相关库设计用于存储大量数据,并允许对其进行快速高效的I/O


该项目提供了一种从python使用它们的好方法,并提供了排序和搜索的方法

日志解析器。我建议您查看msft日志解析器。这包含在iis资源工具包中,提供了许多您需要的内容。也许最有用的功能是能够在平面文件上执行类似SQL的查询。甚至可以跨文件执行此操作。

一个选项可能是,或者类似的嵌入式数据库管理器

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

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


如果是类似的(我几年前用过一段时间),那应该很简单。

您没有声明语言。因此,只需提供一个模块,允许您以一种有效的方式对文件进行随机访问:

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

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

如果您只需要进行简单的排序,那么从排序字段构造文件名,并将其他字段放入文件中。如果您知道需要哪些字段,则选择很快

最重要的是,api内置在操作系统中


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

为什么要排除PgSQL和MySQL这样的数据库?它不需要很多努力就可以设置