Package: vectorgrep
VectorGrepVectorGrep is a high-performance (Vectorized) Global Regular Expression "Processing" library for Python. It uses
Vectorscan (a portable fork of Intel Hyperscan) to maximize performance, and can be used with multithreaded
or multiprocessed applications. VectorGrep is also home tovectorgrep(Vectorized Global Regular Expression Printer),
a multithreaded/multi-file "grep" command to search many files in parallel. It can often be used as a drop in
replacement forgrep/egrep/zgrepetc.While a standard "grep" is designed to "print", VectorGrep is designed to allow full control over "processing".
It supports scanning compressed, or uncompressed, text files for regular expressions, and customizing the action
to take when a match is found. For full information about the performance of Vectorscan (and Hyperscan), refer to:VectorCamp: VectorscanIntel: HyperscanVectorGrep also is the successor toHyperGrep. It is designed to be
a drop in replacement for the original during initial releases. Refer to theFAQfor more information
about this change.Table Of ContentsKey FeaturesCompatibilityGetting StartedInstallationExamplesContributeAdvanced GuidesFAQKey FeaturesSimplicityNo experience with Vectorscan/Hyperscan required. Provides "grep" styled interfaces.No external dependencies, and no building required (on natively supported platforms).Built in support for compressed and uncompressed files.SpeedUses Vectorscan/Hyperscan, a high-performance multiple regex matching library.Performs read and regex operations outside Python.Batches results for Python, reducing overhead (customizable).ParallelismBypasses GIL (Global Interpreter Lock) during read and regex operations to allow proper multithreading.Python consumer threads (callbacks) are able to handle many producer threads (readers).CompatibilitySupports Python 3.10+Supports Linux systems with x86_64 architectureTested on Ubuntu Bionic (18.04) and aboveOther Linux distros may work, but are not guaranteedMay be able to be built on Windows/OSX manuallyMore platforms are planned to be supported (natively) in the futureSome regex constructs are not supported by Vectorscan/Hyperscan in order to guarantee stable performanceFor more information refer to:Unsupported ConstructsGetting StartedInstallationInstall VectorGrep via pip:pipinstallvectorgrepOr via git clone:gitclone<pathtofork>cdvectorgrep
pipinstall.Or build and install from wheel:# Build locally.gitclone<pathtofork>cdvectorgrep
makewheel# Push dist/vectorgrep*.tar.gz to environment where it will be installed.pipinstalldist/vectorgrep*.tar.gzExamplesRead one file with the example single threaded command:# vectorgrep/scanner.py <regex> <file>vectorgrep/scanner.pypattern./vectorgrep/scanner.pyRead multiple files with the multithreaded command (drop in replacement forgrepwhere patterns are compatible):# From install:# vectorgrep <regex> <file(s)>vectorgreppattern./vectorgrep/scanner.py# From package:# vectorgrep/multiscanner.py <regex> <file>vectorgrep/multiscanner.pypattern./vectorgrep/scanner.pyCollect all matches from a file, similar to grep, and perform a custom operation on results:importvectorgrepfile="./vectorgrep/scanner.py"pattern='pattern'results,return_code=vectorgrep.grep(file,[pattern])forindex,lineinresults:print(f'{index}:{line}')Manually scan a file and perform a custom operation on match:importvectorgrepfile="./vectorgrep/scanner.py"pattern='pattern'defon_match(matches:list,count:int)->None:forindexinrange(count):match=matches[index]line=match.line.decode(errors='ignore')print(f'Custom print:{line.rstrip()}')vectorgrep.scan(file,[pattern],on_match)Override thelibhsand/orlibzstdlibraries to use files outside the package.
Must be called before any other usage ofvectorgrep:importvectorgrepvectorgrep.configure_libraries(libhs='/home/myuser/libhs.so.mybuild',libzstd='/home/myuser/libzstd.so.mybuild',)ContributingRefer to theContributing Guidefor information on how to contribute to this project.Advanced GuidesRefer toHow Tosfor more advanced topics, such as building the shared library objects.FAQQ: How does VectorGrep compare to other Vectorscan/Hyperscan python libraries?A:VectorGrep has a specific goal: provide a high performance "grep" like interface in python,
but with more control. It is not intended to be a full set of bindings to Vectorscan/Hyperscan. If you need
full control over the low level backend, there are other python libraries intended for that use case. Here are
a few of the reasons for the focused goal of this library:Simplify developer integration.No experience with Vectorscan/Hyperscan required.Familiarity withgrepvariants beneficial, but not required.Avoid messy subprocess chains common in "parallel grep" implementations.Commands likezgrepare actually azcat+grep. This can lead to 3+ processes per file read.Subprocessing is messy in general, best to minimize its use as much as possible.Optimize performance.Reduce callbacks to/from python to reduce overhead.Allow true multithreading during read and regex matching.Provide the pattern matched in multi-regex searches, without having to repeat the search in Python.When it comes to performance, here is an example of the benefit of this design. Due to the performance of
Vectorscan/Hyperscan, it is also often faster than nativegrepvariants, even while using python. Scenario setup:2.10GHz Intel x86_64 Processor~17M line file (~300M gzip compressed, ~3G uncompressed).~800 PCRE patterns.Counting only, no extra processing of lines.Each job run 5 times and averaged (lower is better).Scenario (Uncompressed timings in parenthesis)VectorGrepFull bindingszgrep (grep)1~90K matches, 1 pattern8.2s (2.5s)22.8s (15.5s)12.5s (5.2s)2~900K matches, 10 patterns9.7s (3.8s)25.7s (16.8s)19.8s (17.3s)3~15M matches, ~800 patterns44.2s (38.1s)73.5s (57.7s)*4Scenario #3 (x4 files), 1 process (4 threads)49.6s (46.8s)1432.6s (1302.2s)*GNU grep does not allow multiple PCRE patterns natively, and concatenation via "or" failed.Q: Why was Vectorscan forked from Hyperscan?A:Vectorscan was originally created to provide a portable fork of Hyperscan, and allow running on other
architectures such as ARM. Intel changed the license of Hyperscan from BSD to IPL (Intel Proprietary License)
starting in 5.5, while Vectorscan continues to provide updates and remain fully open source. For more information:Vectorscan: Why was there a need for a fork?Vectorscan: Hyperscan license changeQ: Why is VectorGrep not a fork of HyperGrep?A:HyperGrep receives maintenance updates, but over time it will become a different solution from
VectorGrep, and eventually become no longer updated, due to the licensing changes made by Intel to Hyperscan. In order
to keep the responsibilities of each clearly separated, and avoid any confusion about backports or feature requests,
it was decided to make a "clean cut" of HyperGrep, instead of using a "fork". There are no plans to backport any
features from VectorGrep to HyperGrep. VectorGrep starts from HyperGrep commit 9c6f2b2. The original commit
history can be found inHyperGrep History