Skip to content

High memory usage and long startup time in ndpiReader with large category lists (-G) – proposal for binary .ndb backend #3151

Description

@fabiodepin

While working with large custom category datasets, we observed significant scalability limitations in ndpiReader when using the current text-based category loading (-G).

Test setup
• Total domains: ~7,848,883
• Total categories: 96
• Source: /etc/categories/*
• Environment: Linux

Results

Baseline (no categories loaded)
Total memory allocated: 9.03 MB
Setup Time: 107 ms

Using -G (text-based categories)
Total memory allocated: 892.46 MB
Setup Time: 7834 ms

Observations:
• Extremely high memory consumption (~892 MB)
• Very long initialization time (~7.8 seconds)

Using binary .ndb backend (prototype)
Total memory allocated: 9.06 MB
Setup Time: 1128 ms

Observations:
• Memory usage reduced to near baseline levels
• Startup time significantly improved compared to -G

⸻

Problem summary

The current text-based category loading (-G):
• Does not scale well for large datasets (millions of domains)
• Consumes large amounts of RAM due to in-memory structures (AC, strings, etc.)
• Has high initialization overhead
• Negatively impacts runtime performance

⸻

Proposed solution

Introduce (or support upstream) a binary category database format (.ndb) with:
• Precompiled domain index
• mmap-based loading
• Suffix-based lookup (domain → parent domains)
• Fixed category IDs (aligned with ndpi_protocol_category_t)

Key advantages
• Drastically reduced memory usage (no large in-memory AC structures)
• Faster startup (no parsing or building of runtime structures)
• Improved lookup performance
• Better scalability for NGFW / large deployments

⸻

Additional notes
• The prototype maintains compatibility with existing behavior:
• Built-in categories unchanged
• IP-based classification unchanged (Patricia trees)
• Optional hybrid mode (ndb + legacy fallback)
• Normalization and suffix matching follow a consistent contract between generator and runtime

⸻

Use case

This is particularly relevant for:
• NGFW / DPI systems
• Large-scale URL/category filtering
• Deployments with millions of domains

⸻

Conclusion

The current -G approach works well for small datasets, but does not scale to millions of domains.

The .ndb approach demonstrates:
• ~100x reduction in memory usage
• ~7x faster startup vs -G
• Better runtime performance

We believe this could be a valuable addition to nDPI for high-scale environments.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions