我有一些巨大的二进制驱动程序日志(每个大约2-5GB,并且在将它们转换为可读形式后可能大约是10倍)并且我需要编写一个工具来允许我按顺序浏览,排序,搜索和有效地过滤它们(为了找到并解决错误)。
每个日志条目都有很少的属性,如:时间戳,类型,消息,一些GUID。条目是同质的,没有关系,在“检查”之后不需要存储数据。
我真的不知道如何处理这么多数据。将所有内容保存在内存中将是愚蠢的,将数据保存在平面文件中也是如此。我想过使用像SQLite这样的小型DBMS,但我不确定它是否足够快而且我不需要很多DMBS功能 - 只需要排序和搜索。如果可能的话,在这种情况下,我会急切地换空间以获得速度。
是否有任何库(或可能是数据结构)可以帮助我处理大量数据?
“服务”像Postgre,MSSQL,MySQL这样的RDBMS是不可能的,该工具应该易于使用,没有任何麻烦。
编辑: 哦,有没有人知道SQLite的“:memory”模式是否对数据库的大小有任何限制,或者只是填充虚拟内存直到它完全填满?
答案 0 :(得分:12)
签出STXXL - 超大型数据集的标准模板库。
“STXXL的核心是用于外部存储器(核外)计算的C ++标准模板库STL的实现,即STXXL实现了可以处理仅适合磁盘的大量数据的容器和算法。虽然与STL的兼容性支持易用性和与现有应用程序的兼容性,但另一个设计优先级是高性能。“
此外,如果您可以为此任务专用多台计算机,请检查Hadoop。特别是HBase,Hive和MapReduce。
答案 1 :(得分:6)
我认为将其存储在DBMS中是合适的方法。排序和搜索是DB擅长执行的任务 - 使用这么多数据,使用专为此目的而设计的工具将是一个巨大的优势。
尽管非关系数据存储可能会占用更少的空间,但SQLite可以很好地解决这个问题。但是,如果你想搜索多个“条目”,那么数据库肯定是要走的路。答案 2 :(得分:5)
答案 3 :(得分:3)
如何使用某种内存映射I / O,比如Java MappedByteBuffer并推出自己的工具?
从MBBs上的SO答案中解释,
基本上,这种机制使用操作系统的虚拟内存分页系统来“映射”你的文件,并以编程方式将它们呈现为字节缓冲区。操作系统将自动且非常快速地管理磁盘和内存中的字节数。
为每个日志文件创建此类文件以读取它们是有意义的。警告是你应该在64位,因为这会给你的文件一个TB限制而不是GB。
浏览,过滤和排序 只是在某个层次结构中显示文件并使用文件名(如文件名或时间戳)对它们进行排序,在处理MBB时,应该使用自己的代码。您的过滤条件是什么?
搜索强> 现在,如果你想搜索它们 - 在此之上运行的Lucene将为你提供一个很好的索引文件的方法。您可以采用多种方式来实现这一点 - 使用hadoop和Map / Reduce,就像其他人提到的那样,可以在多台机器上分配任务。
this网站上的效果提示很棒。
答案 4 :(得分:2)
答案 5 :(得分:2)
记录解析器。我建议您查看msft日志解析器。这包含在iis资源工具包中,并提供了许多您正在寻找的内容。也许最有用的功能是能够在平面文件上执行SQL查询。这甚至可以跨文件完成。
答案 6 :(得分:1)
一个选项可能是Berkeley DB,或者某个类似的可嵌入数据库管理器。
我没有使用过Berkely DB,但是从快速的角度来看,我猜它类似于几年前的许多ISAM数据库管理器 - 基本上是一个用于处理磁盘上的密钥的库 - >数据索引数据结构。唯一的警告 - 我看到提到哈希表,所以它可能不会执行ISAM的顺序部分,但我希望它确实 - 最新版本甚至有SQL支持。
您不一定需要将完整的二进制日志翻译成可读的形式。您可以执行初始索引构建扫描,将偏移量保存到原始文件中。一个有用的索引可能只是从行号到字节范围,因此您可以快速显示特定的行范围 - 尽管只有当日志记录是可变长度时,当然。
如果它像Btrieve(我多年前使用了一段时间),它应该很容易。
答案 7 :(得分:0)
你没说过语言。因此,只需提供一个模块,允许您以有效的方式对文件进行随机访问:http://perldoc.perl.org/Tie/File.html
答案 8 :(得分:0)
“时间戳,类型,消息,一些GUID。条目是同质的,没有关系,在”检查“它之后不需要存储数据。”
您是否考虑过将离散条目作为单独的文件存储在目录中?
如果您只需要进行简单排序,则从排序字段构造文件名并将其他文件放入文件中。如果你知道你想要哪个字段,选择很快。
最重要的是,api内置于操作系统中。
...
显然,如果您需要比这更灵活的东西,那么您将需要一个合适的数据库,但它可能会根据您的要求而有效。