I have refactored tz_world to separate different backend strategies. Please feel free to give it a try, I plan to release a new version on hex later this week.
New Backend Access modules
TzWorld.Backend.Memorywhich retains all data in memory for fastest performance at the expense of using approximately 1Gb of memoryTzWorld.Backend.Detswhich uses Erlang’s:detsdata store. This uses negligible memory at the expense of slow access times (approximaltey 500ms in testing)TzWorld.Backend.DetsWithIndexCachewhich balances memory usage and performance. This backend is recommended in most situations since its performance is similar toTzWorld.Backend.Memory(about 5% slower in testing) and uses about 25Mb of memoryTzWorld.Backend.Etswhich uses:etsfor storage. With the default settings of:compressedfor the:etstable its memory consumption is about 512Mb but with access that is over 20 times slower thanTzWorld.Backend.DetsWithIndexCache
Most interesting is that by caching the bounding boxes in memory, the backend TzWorld.Backend.DetsWithIndexCache looks to be a good balance of memory utilisation and performance. It uses only ~20Mb of memory to store the bounding boxes and has performance similar to the in-memory backend.
Basic Benchmark
Name ips average deviation median 99th %
Backend Memory 52.34 19.10 ms ±14.86% 18.34 ms 30.62 ms
Backend DetsWithIndexCache 50.10 19.96 ms ±13.15% 20.79 ms 24.66 ms
Backend Ets 2.33 428.53 ms ±2.51% 432.73 ms 441.58 ms
Backend Dets 0.59 1693.80 ms ±9.62% 1646.47 ms 2018.27 ms
Comparison:
Backend Memory 52.34
Backend DetsWithIndexCache 50.10 - 1.04x slower +0.85 ms
Backend Ets 2.33 - 22.43x slower +409.43 ms
Backend Dets 0.59 - 88.66x slower +1674.70 ms






















