Не уверен, что это то, что вам нужно, но при условии, что у вас есть доступ на чтение / запись к существующей postgres БД:
import numpy as np
import psycopg2 as psy
import pickle
db_connect_kwargs = {
'dbname': '<YOUR_DBNAME>',
'user': '<YOUR_USRNAME>',
'password': '<YOUR_PWD>',
'host': '<HOST>',
'port': '<PORT>'
}
connection = psy.connect(**db_connect_kwargs)
connection.set_session(autocommit=True)
cursor = connection.cursor()
cursor.execute(
"""
DROP TABLE IF EXISTS numpy_arrays;
CREATE TABLE numpy_arrays (
uuid VARCHAR PRIMARY KEY,
np_array_bytes BYTEA
)
"""
)
Суть этого подхода заключается в хранении любых numpy массив (произвольной формы и типа данных) в виде строки в таблице numpy_arrays
, где uuid
- уникальный идентификатор, позволяющий позднее получить массив. Фактический массив будет сохранен в столбце np_array_bytes
в байтах.
Вставка в базу данных:
some_array = np.random.rand(1500,550)
some_array_uuid = 'some_array'
cursor.execute(
"""
INSERT INTO numpy_arrays(uuid, np_array_bytes)
VALUES (%s, %s)
""",
(some_array_uuid, pickle.dumps(some_array))
)
Запрос из базы данных:
uuid = 'some_array'
cursor.execute(
"""
SELECT np_array_bytes
FROM numpy_arrays
WHERE uuid=%s
""",
(uuid,)
)
some_array = pickle.loads(cursor.fetchone()[0])
Производительность ?
Если бы мы могли хранить наши NumPy массивы непосредственно в PostgreSQL, мы бы получили значительное повышение производительности.
Я не тестировал это подход в любом случае, поэтому я не могу ни подтвердить, ни опровергнуть это ...
Дисковое пространство?
Я предполагаю, что этот подход занимает столько же дискового пространства, сколько выгрузка массивов в файл с использованием np.save('some_array.npy', some_array)
. Если это проблема, рассмотрите возможность сжатия байтов перед вставкой.