Tôi hoàn toàn khuyên bạn nên sử dụng cơ sở dữ liệu đối tượng python như ZODB. Nó có vẻ khá phù hợp cho tình huống của bạn, xem xét bạn lưu trữ các đối tượng (theo nghĩa đen bất cứ điều gì bạn thích) vào một từ điển - điều này có nghĩa là bạn có thể lưu trữ từ điển bên trong từ điển. Tôi đã sử dụng nó trong một loạt các vấn đề, và điều tốt đẹp là bạn chỉ có thể trao cho ai đó tệp cơ sở dữ liệu (tệp có phần mở rộng .fs). Với điều này, họ sẽ có thể đọc nó và thực hiện bất kỳ truy vấn nào họ muốn và sửa đổi các bản sao cục bộ của riêng họ. Nếu bạn muốn có nhiều chương trình cùng lúc truy cập vào cùng một cơ sở dữ liệu, tôi chắc chắn sẽ xem xét ZEO.
Chỉ cần một ví dụ ngớ ngẩn như thế nào để bắt đầu:
from ZODB import DB
from ZODB.FileStorage import FileStorage
from ZODB.PersistentMapping import PersistentMapping
import transaction
from persistent import Persistent
from persistent.dict import PersistentDict
from persistent.list import PersistentList
# Defining database type and creating connection.
storage = FileStorage('/path/to/database/zodbname.fs')
db = DB(storage)
connection = db.open()
root = connection.root()
# Define and populate the structure.
root['Vehicle'] = PersistentDict() # Upper-most dictionary
root['Vehicle']['Tesla Model S'] = PersistentDict() # Object 1 - also a dictionary
root['Vehicle']['Tesla Model S']['range'] = "208 miles"
root['Vehicle']['Tesla Model S']['acceleration'] = 5.9
root['Vehicle']['Tesla Model S']['base_price'] = "$71,070"
root['Vehicle']['Tesla Model S']['battery_options'] = ["60kWh","85kWh","85kWh Performance"]
# more attributes here
root['Vehicle']['Mercedes-Benz SLS AMG E-Cell'] = PersistentDict() # Object 2 - also a dictionary
# more attributes here
# add as many objects with as many characteristics as you like.
# commiting changes; up until this point things can be rolled back
transaction.get().commit()
transaction.get().abort()
connection.close()
db.close()
storage.close()
Khi cơ sở dữ liệu được tạo ra nó rất dễ sử dụng. Vì nó là một cơ sở dữ liệu đối tượng (một cuốn từ điển), bạn có thể truy cập vào đối tượng rất dễ dàng:
#after it's opened (lines from the very beginning, up to and including root = connection.root())
>> root['Vehicles']['Tesla Model S']['range']
'208 miles'
Bạn cũng có thể hiển thị tất cả các phím (và làm tất cả những thứ khác chuẩn từ điển mà bạn có thể muốn làm):
>> root['Vehicles']['Tesla Model S'].keys()
['acceleration', 'range', 'battery_options', 'base_price']
Điều cuối cùng tôi muốn đề cập là các phím có thể được thay đổi: Changing the key value in python dictionary. Giá trị cũng có thể được thay đổi - vì vậy nếu kết quả nghiên cứu của bạn thay đổi bởi vì bạn thay đổi phương thức hoặc thứ gì đó bạn không phải khởi động toàn bộ cơ sở dữ liệu từ đầu (đặc biệt là nếu mọi thứ khác vẫn ổn). Hãy cẩn thận khi thực hiện cả hai điều này. Tôi đưa ra các biện pháp an toàn trong mã cơ sở dữ liệu của mình để đảm bảo rằng tôi biết các nỗ lực của mình để ghi đè khóa hoặc giá trị.
** THÊM **
# added imports
import numpy as np
from tempfile import TemporaryFile
outfile = TemporaryFile()
# insert into definition/population section
np.save(outfile,np.linspace(-1,1,10000))
root['Vehicle']['Tesla Model S']['arraydata'] = outfile
# check to see if it worked
>>> root['Vehicle']['Tesla Model S']['arraydata']
<open file '<fdopen>', mode 'w+b' at 0x2693db0>
outfile.seek(0)# simulate closing and re-opening
A = np.load(root['Vehicle']['Tesla Model S']['arraydata'])
>>> print A
array([-1. , -0.99979998, -0.99959996, ..., 0.99959996,
0.99979998, 1. ])
Bạn cũng có thể sử dụng numpy.savez() cho tiết kiệm nén của nhiều mảng NumPy trong cùng một cách chính xác này.
Bạn đã xem sử dụng hệ thống cơ sở dữ liệu NoSQL như MongoDB? –
@Xaranke Đó là một ý tưởng tốt, nhưng tôi nghi ngờ nó sẽ cung cấp lưu trữ mảng hiệu quả numpy ... hoặc có thể nó sẽ? –
Bạn có thể lưu một mảng có nhiều mảng như một đối tượng nhị phân như được hiển thị ở đây: http://stackoverflow.com/questions/6367589/saving-numpy-array-in-mongodb –