oi

command module
v0.0.0-...-99a402f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 1, 2021 License: MIT Imports: 6 Imported by: 0

README

oi

Status: Done (waiting for feedback)

Build Status

Description

oi is a command-line utility for searching plain-text data sets for next lines defined in patterns file. Its name comes from an abbreviation: ordered intersections, which explains the way of filtering the given data set.

So far, no regular expressions are supported and the matching line must occur only once.

Quickstart

Download, install oi and filter given data set:

go get github.com/mtojek/oi
cat data | oi -p patterns

Filter request logs faster than *nix "grep" (11 min to <50 ms)

Default release of *nix grep does not support filtering data sets by matching only one pattern from the given pattern set. It means that if you want to filter a huge log file by providing a list of request IDs, every line of the log file will be compared with all request IDs. It's definitely a set intersection but super-inefficient.

oi operates differently. Provided that a request ID appears only once in a log file and patterns file contains all request IDs to be filtered in the proper order, the number of comparisons for an every log line is decreased to 1 operation instead of N (number of request IDs to be filtered).

Sample usage

The data file contains 50000 of request log records and its total size is 2MB (2138894 B):

$ cat data
BA47E06D-00B2-4320-BC20-F3DC52ED242D 1
8F99A036-C084-43EB-95B5-F8540017FA4C 2
215EDC9D-3C49-43C1-8F27-53DE904BF6ED 3
BF96EB67-E3BA-4D90-B62C-A8C86A4D3305 4
27D0BB4E-A52C-4241-BE77-540ED5DDA1DE 5
FF74AD5A-42C5-4DC3-AFA1-FDF3BD6DB14D 6
734FFB36-BEF8-4DAD-A63D-978711715D14 7
E880982D-7A30-4277-B4CE-C1DD88FE1810 8
B2CD083A-C18A-460C-8C8F-D5072CFB0515 9
06428C75-1EB7-406E-801A-4C3796A50BA3 10
...

Let's filter 1/3 of requests (16666 rows). The patterns file contains the following request IDs:

$ cat patterns
215EDC9D-3C49-43C1-8F27-53DE904BF6ED
FF74AD5A-42C5-4DC3-AFA1-FDF3BD6DB14D
B2CD083A-C18A-460C-8C8F-D5072CFB0515
3A3E702E-442E-4EF8-AD3E-A31CAAFF75D9
61830C85-2054-4673-9020-9F840081059F
5361F961-5FCA-412C-A685-E2C135C90C77
5AAB80AD-5B4A-448E-8878-F63476853527
796B869A-CA5D-4483-913A-99C05EDEF1DB
15E8B340-E082-43C6-B350-E2F549D65763
9A770FF9-213F-497B-8490-0D62C442C4B3
...

The default grep usage for such data intersection is:

$ time cat data | grep -f patterns > output
real	11m5.165s
user	10m55.544s
sys	0m1.060s

Notice: tested on Macbook Pro 2.6 GHz i5, 8GB DDR3

The operation takes 11 min to finish and the tool performs a plenty of unnecessary comparisons.

Let's try to do the same with oi:

$ time cat data | oi -p patterns > output
real	0m0.048s
user	0m0.014s
sys	0m0.030s

The total time decreased to <50 ms. Nice, let's start using oi!

Contact

Please feel free to leave any comment or feedback by opening a new issue or contacting me directly via email. Thank you.

License

MIT License, see LICENSE file.

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL