Khi sử dụng pytables
, không có hỗ trợ (theo như tôi có thể biết) cho các định dạng ma trận scipy.sparse
, do đó, để lưu trữ ma trận, tôi phải thực hiện một số chuyển đổi, ví dụ:Sử dụng pytables, hiệu quả hơn: ma trận scipy.sparse hoặc dày đặc dày đặc?
def store_sparse_matrix(self):
grp1 = self.getFileHandle().createGroup(self.getGroup(), 'M')
self.getFileHandle().createArray(grp1, 'data', M.tocsr().data)
self.getFileHandle().createArray(grp1, 'indptr', M.tocsr().indptr)
self.getFileHandle().createArray(grp1, 'indices', M.tocsr().indices)
def get_sparse_matrix(self):
return sparse.csr_matrix((self.getGroup().M.data, self.getGroup().M.indices, self.getGroup().M.indptr))
Vấn đề là các get_sparse
chức năng phải mất một thời gian (đọc từ đĩa), và nếu tôi hiểu nó một cách chính xác cũng đòi hỏi dữ liệu để phù hợp với bộ nhớ.
Tùy chọn duy nhất khác dường như chuyển đổi ma trận thành định dạng dày đặc (numpy array
) và sau đó sử dụng pytables
bình thường. Tuy nhiên điều này có vẻ là không hiệu quả, mặc dù tôi cho rằng có lẽ pytables
sẽ đối phó với bản thân nén?
Sử dụng một mảng NumPy thông thường chắc chắn sẽ yêu cầu toàn bộ ma trận, bao gồm cả số không, để vừa với bộ nhớ. Bạn cũng sẽ không thể khai thác sự thưa thớt trong thuật toán của mình. Nhưng chính xác thì câu hỏi của bạn là gì? –
@larsmans nhưng khi sử dụng một mảng NumPy kết hợp với pytables, sự hiểu biết của tôi là nó chỉ tải từ đĩa khi cần thiết, và do đó toàn bộ ma trận không phải phù hợp với bộ nhớ. Tuy nhiên nó yêu cầu toàn bộ ma trận, kể cả số không, được lưu trữ trên đĩa (và do đó đọc/ghi vào đĩa khi cần thiết). Dường như điều này sẽ tạo ra chi phí không cần thiết, khi trong thực tế chỉ có một vài giá trị có thể cần phải được đọc. Tuy nhiên mà không có hỗ trợ cho scipy.sparse tôi không thể xem làm thế nào để tránh điều này? – tdc
Vì vậy, câu hỏi là, "điều này sẽ yêu cầu tải ma trận CSR?" Tôi không thể trả lời vì tôi không biết PyTables. Tôi biết rằng bạn có thể xây dựng một ma trận CSR được hỗ trợ bởi mảng mmap'd ... –