ClickHouse is using infinite cache for compiled regular expressions.
Hyperscan can use several megabytes per compiled regexp.
It makes infinite memory growth possible:

```
clickhouse-benchmark --query "SELECT multiFuzzyMatchAny('Hello, world', 5, ['(' || (SELECT toString(rand(1))) || '|' || (SELECT toString(rand(2))) || ')+(' || (SELECT toString(rand(3))) || '|' || (SELECT toString(rand(4))) || ')+(' || (SELECT toString(rand(5))) || ')+'])"
```

Possible solutions:
- simply drop cache if its size is 1000 entries;
- replace to LRU cache with 1000 entries.

needles.reserve(needles_offsets[i] - prev_needles_offset);
            for (size_t j = prev_needles_offset; j < needles_offsets[i]; ++j)
            {
                needles.emplace_back(needles_data_string->getDataAt(j).toView());
            }
            if (needles.empty())
            {
                prev_haystack_offset = haystack_offsets[i];
                prev_needles_offset = needles_offsets[i];
                continue;
            }
            checkHyperscanRegexp(needles, max_hyperscan_regexp_length, max_hyperscan_regexp_total_length);
            for (size_t j = 0; j < needles.size(); ++j)
            {
                String needle(needles[j]);
                const auto & regexp = Regexps::Regexp(Regexps::createRegexp< false,  true,  false>(needle));
                String required_substr;
                bool is_trivial;
                bool required_substring_is_prefix; 
                regexp.getAnalyzeResult(required_substr, is_trivial, required_substring_is_prefix);
                if (required_substr.empty())
                {
                    if (!regexp.getRE2()) 
                    {
                        if constexpr (FindAny)
                            res[i] |= 1;
                        else if (FindAnyIndex)
                            res[i] = j + 1;
                    }
                    else