Вставьте массив Numpy из элементов float64 в PostgreSQL как двоичный файл - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь вставить массив Numpy в PostgreSQL. Пытался сделать вот так

def write_to_db(some_arr, some_txt):
""" insert a new array into the face_ar table """
    sql = """INSERT INTO test_db VALUES(%s,%s);"""
    conn = None
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute(sql, (some_arr, some_txt))
        conn.commit()
        cur.close()

    except (Exception, psycopg2.DatabaseError) as e:
        print(e)
    finally:
        if conn is not None:
            conn.close()

Перед этим я создал таблицу в моей БД

create table test_db (encodings double precision[], link text);

Наконец-то я получил ошибку: "не могу адаптировать тип 'numpy.ndarray'"

Мне нужно написать массив Numpy из 125 элементов float64 и небольшой текст, например, ссылку в каждой строке. В моем проекте будет несколько миллионов строк. Важна только скорость чтения и размер БД. Как я понял, невозможно вставить массив Numpy напрямую, и нужно преобразовать его в другой формат. Первая идея, которую я получил, состояла в том, чтобы преобразовать их в двоичные данные и сохранить в БД, но я не знаю, как это сделать и как вернуть его из БД в формате массива Numpy.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Спасибо Василию Кушниру. Этот метод начал работать хорошо и быстро для чтения данных

import psycopg2
from config import config
import msgpack
import msgpack_numpy as m

def write_to_db(encoding, link):
""" insert a new array into the test1_db table """
    sql = """INSERT INTO test1_db VALUES(%s,%s);"""
    conn = None
    dumped_data = msgpack.packb(encoding, default=m.encode)
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute(sql, (dumped_data, link))
        conn.commit()
        cur.close()

    except (Exception, psycopg2.DatabaseError) as e:
        print(e)
    finally:
        if conn is not None:
            conn.close()

def read_from_db():
""" query data from the test1_db table """
    conn = None
    row = None
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute("SELECT encodings, link FROM test1_db")
        print("The number of rows: ", cur.rowcount)
        row = cur.fetchone()
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
        encoding1, somelink = row
        return msgpack.unpackb(encoding1, object_hook=m.decode), somelink
0 голосов
/ 13 января 2019

Попробуйте использовать pickle python для двоичной сериализации / десериализации

Пример:

import numpy as np
from pickle import dumps, loads
data=np.array([1,2,4,5,6])
dumped_data = dumps(data)
loaded_data = loads(dumped_data)
print(dumped_data)
print(loaded_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...