Popularity
1.6
Declining
Activity
6.6
-
3
2
0
Monthly Downloads: 30
Programming language: Haskell
License: BSD 3-clause "New" or "Revised" License
Latest version: v0.1.0
streamly-lmdb alternatives and similar packages
Based on the "Database" category.
Alternatively, view streamly-lmdb alternatives based on common mentions on social networks and blogs.
-
erd
Translates a plain text description of a relational database schema to a graphical entity-relationship diagram. -
HDBC-session
This repository includes a joined query generator based on typefull relational algebra, and mapping tools between SQL values list and Haskell record type. -
groundhog
This library maps datatypes to a relational model, in a way similar to what ORM libraries do in OOP. See the tutorial https://www.schoolofhaskell.com/user/lykahb/groundhog for introduction -
mysql-simple
A mid-level client library for the MySQL database, intended to be fast and easy to use. -
dbmigrations
DISCONTINUED. A library for the creation, management, and installation of schema updates for relational databases. -
ampersand
Build database applications faster than anyone else, and keep your data pollution free as a bonus.
InfluxDB - Power Real-Time Data Analytics at Scale
Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
Promo
www.influxdata.com
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of streamly-lmdb or a related project?
README
streamly-lmdb
Stream data to or from LMDB databases using the Haskell streamly library.
Requirements
Install LMDB on your system:
- Debian Linux:
sudo apt-get install liblmdb-dev
. - macOS:
brew install lmdb
.
Quick start
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Streamly.External.LMDB
(Limits (mapSize), WriteOptions (writeTransactionSize), defaultLimits,
defaultWriteOptions, getDatabase, openEnvironment, readLMDB,
tebibyte, writeLMDB)
import qualified Streamly.Prelude as S
main :: IO ()
main = do
-- Open an environment. There should already exist a file or
-- directory at the given path. (Empty for a new environment.)
env <- openEnvironment "/path/to/lmdb-database" $
defaultLimits { mapSize = tebibyte }
-- Get the main database.
-- Note: It is common practice with LMDB to create the database
-- once and reuse it for the remainder of the program’s execution.
db <- getDatabase env Nothing
-- Stream key-value pairs into the database.
let fold' = writeLMDB db defaultWriteOptions { writeTransactionSize = 1 }
let writeStream = S.fromList [("baz", "a"), ("foo", "b"), ("bar", "c")]
_ <- S.fold fold' writeStream
-- Stream key-value pairs out of the
-- database, printing them along the way.
-- Output:
-- ("bar","c")
-- ("baz","a")
-- ("foo","b")
let unfold' = readLMDB db
let readStream = S.unfold unfold' undefined
S.mapM_ print readStream
Benchmarks
See bench/README.md
. Summary (with rough figures from our machine†):
- Reading. For reading a fully cached LMDB database, this library (when
unsafeReadLMDB
is used instead ofreadLMDB
) has a 10 ns/pair overhead compared to plain HaskellIO
code, which has another 10 ns/pair overhead compared to C. (The first two being similar fulfills the promise of streamly and stream fusion.) We deduce that if your total workload per pair takes longer than 20 ns, your bottleneck will not be your usage of this library as opposed to C. - Writing. Writing with plain Haskell
IO
code and with this library is, respectively, 10% and 20% slower than writing with C. We have not dug further into these differences because this write performance is currently good enough for our purposes.
† Linode; Debian 10, Dedicated 32GB: 16 CPU, 640GB Storage, 32GB RAM.