私たちのチームは、我々のコードは非常に多くのことを遅くしたファイルの中にnumpyのデータをダンプに大きく依存しているソフトウェアを使用しています。我々は、PostgreSQLに直接私たちのnumpyのアレイを保存することができれば、我々は主要なパフォーマンスの向上を得るでしょう。
任意のデータベースまたは検索可能なデータベースのような構造でnumpyのアレイを記憶する他のパフォーマンスの方法は歓迎されているが、PostgresSQLのが好ましいであろう。
私の質問は1つが以前に尋ねたと非常によく似ています。しかし、私は、より堅牢でパフォーマンスの答えを探していますし、私は、任意のnumpyの配列を保存したいです。
わからないこれはあなたが後にしているものですが、既存のPostgresのDBへのあなたが読んでいる/書き込みアクセスを想定した場合:
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])
パフォーマンス?
我々は、PostgreSQLに直接私たちのnumpyのアレイを保存することができれば、我々は主要なパフォーマンスの向上を得るでしょう。
私はこのことを確認したり反論することはできませんので、私は、どのような方法でこのアプローチをベンチマークしていません...
ディスクスペース?
私の推測では、このアプローチは、使用してファイルに配列をダンプできるだけ多くのディスクスペースを取ることですnp.save('some_array.npy', some_array)
。これが問題になる場合は挿入前にバイトを圧縮することを検討してください。