【发布时间】:2020-08-10 03:14:10
【问题描述】:
我将下面给出的代码仅用于两个操作:
- 在数据库的最底部插入 numpy 数组
- 拉出第一个数组,然后将其删除
我正在处理的数据将非常大(考虑到低 TB)并且我希望数据在我的硬盘驱动器上按顺序存储和检索(就像旧磁带一样贮存)。现在我已经在这片土地上进行了广泛的搜索,我不确定这是否已经在 sqlite3 上自动完成,或者是否可能。
import io
import numpy as np
import sqlite3
class SQLNumpy():
"""This will insert a numpy array into a sqlite3 instance"""
def __init__(self, db_name):
# Converts np.array to TEXT when inserting
sqlite3.register_adapter(np.ndarray, self.adapt_array)
# Converts TEXT to np.array when selecting
sqlite3.register_converter("array", self.convert_array)
self.db_name = db_name
self.conn = sqlite3.connect(self.db_name, detect_types=sqlite3.PARSE_DECLTYPES)
self.cursor = self.conn.cursor()
self.cursor.execute("""CREATE TABLE IF NOT EXISTS data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
arr ARRAY);""")
def adapt_array(self, arr):
out = io.BytesIO()
np.save(out, arr)
out.seek(0)
return sqlite3.Binary(out.read())
def convert_array(self, text):
out = io.BytesIO(text)
out.seek(0)
return np.load(out)
def insert(self, arr):
self.cursor.execute("INSERT INTO data (arr) values (?)", (arr, ))
def first_select(self):
self.cursor.execute("SELECT arr FROM data LIMIT 1")
self.data = self.cursor.fetchall()
def first_delete(self):
self.cursor.execute("""DELETE FROM data WHERE id in (
SELECT id FROM data LIMIT 1)""")
def commit(self):
self.conn.commit()
def close(self):
self.conn.close()
x = np.random.rand(8760)
x_sql = SQLNumpy("test.db")
x_sql.insert(x)
x_sql.insert(x) # Add two and then remove one.
x_sql.first_select()
print(x_sql.data)
x_sql.first_delete()
x_sql.commit()
x_sql.close()
【问题讨论】:
-
这在代码中没有什么可以解决的,很可能在数据库中也没有。如今,在现代驱动器上,甚至操作系统都没有说明数据的确切存储位置。
-
嗯,有没有办法连接到较低级别的 API 以在 python 上直接访问磁盘?我将在 Ubuntu 服务器上运行我的代码,但可以将其更改为任何提供此服务的 Linux 发行版。
-
听起来你根本没有阅读我的评论。
-
我确实阅读了您的评论,这就是为什么我问是否可能有另一个发行版(或操作系统)允许这样做。或者是低级 API,计算机上的某些进程必须知道数据在哪里。
标签: python sql database sqlite numpy