Skip to main content

Zero-copy shared memory IPC library for building complex streaming data pipelines capable of processing large datasets

Project description

MomentumX


MomentumX is a zero-copy shared memory IPC library for building complex streaming data pipelines capable of processing large datasets using Python.


Key Features:

  • High-Throughput, Low Latency
  • Supports streaming and synchronous modes for use within a wide variety of use cases.
  • Bring your own encoding, or use raw binary data.
  • Sane data protections to ensure reliability of data in a cooperative computing environment.
  • Pairs with other high-performance libraries, such as numpy and scipy, to support parallel processing of memory-intensive scientific data.
  • Works on most modern versions of Linux using shared memory (via /dev/shm).
  • Seamlessly integrates into a Docker environment with minimal configuration, and readily enables lightweight container-to-container data sharing.

Examples:

Below are some simplified use cases for common MomentumX workflows. Consult the examples in the examples/ directory for additional details and implementation guidance.

Stream Mode

# Producer Process
import momentumx as mx

# Create a stream with a total capacity of 10MB (1MB x 10)
stream = mx.Producer('my_stream', buffer_size=int(1e6), buffer_count=10, sync=False)

# Obtain the next available buffer for writing
buffer = stream.next_to_send()
buffer.write(b'1') 

buffer.send()
# NOTE: buffer.send() can also be passed an explicit number of bytes as well. 
# Otherwise an internally managed cursor will be used.
# Consumer Process(es)
import momentumx as mx

stream = mx.Consumer('my_stream')

# Receive from my_stream as long as the stream has not ended OR there are unread buffers 
while stream.has_next:

    # Block while waiting to receive buffer 
    # NOTE: Non-blocking receive is possible using blocking=False keyword argument
    buffer = stream.receive()
    
    # If we are here, either the stream ended OR we have a buffer, so check...
    if buffer is not None:

        # We have buffer containing data, so print the entire contents
        print(buffer.read(buffer.data_size))
    
        # See also "Implicit versus Explicit Buffer Release" section below.

Sync Mode

# Producer Process
import momentumx as mx
import threading
import signal

cancel_event = threading.Event()
signal.signal(signal.SIGINT, (lambda _sig, _frm: cancel_event.set()))

# Create a stream with a total capacity of 10MB
stream = mx.Producer(
    'my_stream', 
    buffer_size=int(1e6), 
    buffer_count=10, 
    sync=True
) # NOTE: sync set to True

min_subscribers = 1

while stream.subscriber_count < min_subscribers:
    print("waiting for subscriber(s)")
    if cancel_event.wait(0.5):
        break

print("All expected subscribers are ready")

# Write the series 0-999 to a consumer 
for n in range(0, 1000):
    if stream.subscriber_count == 0:
        cancel_event.wait(0.5)

    # Note: sending strings directly is possible via the send_string call
    elif stream.send_string(str(n)):
        print(f"Sent: {n}")
# Consumer Process(es)
import momentumx as mx

stream = mx.Consumer('my_stream')

while stream.has_next:
    data = stream.receive_string() 

    if data is not None: 
        # Note: receiving strings is possible as well via the receive_string call
        print(f"Received: {data}")

Iterator Syntax

Working with buffers is even easier using iter() builtin:

import momentumx as mx

stream = mx.Consumer(STREAM)

# Iterate over buffers in the stream until stream.receive() returns None
for buffer in iter(stream.receive, None):     
    # Now, buffer is guaranteed to be valid, so no check required -  
    # go ahead and print all the contents again, this time using 
    # the index and slice operators!
    print(buffer[0])                    # print first byte
    print(buffer[1:buffer.data_size])   # print remaining bytes

Numpy Integration

import momentumx as mx
import numpy as np

# Create a stream
stream = mx.Consumer('numpy_stream')

# Receive the next buffer (or if a producer, obtain the next_to_send buffer)
buffer = stream.receive()

# Create a numpy array directly from the memory without any copying
np_buff = np.frombuffer(buffer, dtype=uint8)

Implicit versus Explicit Buffer Release

MomentumX Consumers will, by default, automatically release a buffer under the covers once all references are destroyed. This promotes both usability and data integrity. However, there may be cases where the developer wants to utilize a different strategy and explicity control when buffers are released to the pool of available buffers.

stream = mx.Consumer('my_stream')

buffer = stream.receive()

# Access to buffer is safe!
buffer.read(10)

# Buffer is being returned back to available buffer pool. 
# Be sure you are truly done with your data!
buffer.release() 

# DANGER: DO NOT DO THIS! 
# All operations on a buffer after calling `release` are considered unsafe! 
# All safeguards have been removed and the memory is volatile!
buffer.read(10) 

Isolated Contexts

MomentumX allows for the usage of streams outside of /dev/shm (the default location). Pass the context kwarg pointing to a directory on the filesystem for both the Producer and all Consumer instances to create isolated contexts.

This option is useful if access to /dev/shm is unsuitable.

import momentumx as mx

# Create a producer attached to the context path /my/path
stream = mx.Producer('my_stream', ..., context='/my/path/')
...

# Create Consumer elsewhere attached to the same context of /my/path
stream = mx.Consumer('my_stream', context='/my/path/')

License

Captivation Software, LLC offers MomentumX under an Unlimited Use License to the United States Government, with all other parties subject to the GPL-3.0 License.

Inquiries / Requests

All inquiries and requests may be sent to opensource@captivation.us.

Copyright © 2022-2023 - Captivation Software, LLC.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

momentumx-2.8.0.tar.gz (51.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

momentumx-2.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (224.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

momentumx-2.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (224.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

momentumx-2.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (225.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

momentumx-2.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (225.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

momentumx-2.8.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (225.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

momentumx-2.8.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (224.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

File details

Details for the file momentumx-2.8.0.tar.gz.

File metadata

  • Download URL: momentumx-2.8.0.tar.gz
  • Upload date:
  • Size: 51.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.9

File hashes

Hashes for momentumx-2.8.0.tar.gz
Algorithm Hash digest
SHA256 ec37336b2ae34ea2898da97858600c7924937fc69fb454a08e269f80fc239f41
MD5 1285b28da0215d341b2a257866c62e14
BLAKE2b-256 5ad7c00b573587dc997bb137d71391c7937bb3835e6645c7c1dcc3f78a8022df

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 58d9640b484dc9d7efe021e3fec9b86d04ad1bee38a73640a69dd5a7f5584ea8
MD5 75243e3f474084fba3a51cddff08fe78
BLAKE2b-256 c714ba1f4d81191b0eb40182662bac8e94e323923478aa4c39728fc85d4eb98c

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 8b9e5c107b4c3ced638b96e0e889cacd1bfbb862b4724f03d394925815d434cf
MD5 2c44720fb143868e3822bae266c9d922
BLAKE2b-256 d2dea74404a648941d602d761409e922da49178ba7c6a73c1b76d5a99d161567

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 dd6b0dd4622ab2d18bb8aa96661602dc2cb59b641cf8927c9ea0208bd3a40f98
MD5 92f1448076c9e4c6900cc996ca9c996f
BLAKE2b-256 1113f75c18a8a4f32682560af0f4209c7f43096db67ff1750c24e4e47fb77cef

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f9415c78ed5f3e33c18025733b7b8dc1e53a699cbcbf735442d7e73c0de49e99
MD5 81576b0ed9ec6fa726766671270ac1d2
BLAKE2b-256 ad4f9462586251fac977c3355c7c9352fa0ac111ce5ff8892ab5f4996740931d

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 08f885dd927caa9e880f3be3f7b66eb3689e3d47383769a97930b211d3785773
MD5 bfe404cb139e6f6f4fea03d117e79244
BLAKE2b-256 6153fb7a7f6396fda9bbdd3d911a304072dc6a0dff16551d9b1f8a072405a8c1

See more details on using hashes here.

File details

Details for the file momentumx-2.8.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for momentumx-2.8.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 6c04e64be6f1b5b012e0a5b8a3c09969458920b9dc7046c09cf87000756c6e47
MD5 b7004fc36205429215d0fa8b765712f0
BLAKE2b-256 fcec601951bddea746b365f927102e1afaa7837b96362a27fc7a68e853019bd5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page