簡體   English   中英

Numpy高效大矩陣乘法

[英]Numpy efficient big matrix multiplication

要在磁盤上存儲大矩陣,我使用numpy.memmap。

以下是測試大矩陣乘法的示例代碼:

import numpy as np
import time

rows= 10000 # it can be large for example 1kk
cols= 1000

#create some data in memory
data = np.arange(rows*cols, dtype='float32') 
data.resize((rows,cols))

#create file on disk
fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols))
fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols))

fp0[:]=data[:]
fp1[:]=data[:]

#matrix transpose test
tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows))
tr= np.transpose(fp1)  #memory consumption?
print fp1.shape
print tr.shape

res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows))
t0 = time.time()
# redifinition ? res= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result)
res[:]= np.dot(fp0,tr) # assignment ?
print res.shape
print (time.time() - t0)

所以我的問題是:

  1. 如何限制使用此過程的應用程序的內存消耗,例如100Mb(或1Gb或其他)的某些值。還有我不明白如何估計程序的內存消耗(我認為內存只在“數據時分配” “創建了變量,但是當我們使用memmap文件時會使用多少內存?)
  2. 也許存在一些存儲在磁盤上的大矩陣乘法的最優解? 例如,數據可能沒有最佳地存儲在磁盤上或者從磁盤中獲取,沒有正確處理,並且點產品只使用一個核心。也許我應該使用像PyTables這樣的東西?

我也對使用有限內存使用的線性方程組(SVD和其他)的算法感興趣。 也許這種算法稱為核外或迭代,我認為有一些類比,如硬盤< - > ram,gpu ram < - > cpu ram,cpu ram < - > cpu cache。

在這里我還發現了一些關於PyTables中矩陣乘法的信息。

我也在R中發現了這個 ,但我需要它用於Python或Matlab。

Dask.array使用阻塞算法和任務調度為大型磁盤陣列提供了一個numpy接口。 它可以很容易地進行核外矩陣乘法和其他簡單的numpy操作。

阻塞的線性代數更難,你可能想看看關於這個主題的一些學術着作。 Dask確實支持高和瘦的矩陣上的QR和SVD分解。

無論對於大型數組,你真的想要阻塞算法,而不是天真的遍歷,這會以不愉快的方式擊中磁盤。

考慮使用NumExpr進行處理: https//github.com/pydata/numexpr

......在內部,NumExpr采用自己的矢量化虛擬機,該虛擬機是圍繞分塊讀取策略設計的,以便有效地在內存中的最佳大小的數據塊上運行。 如果調整得當,它可以輕松擊敗天真的NumPy操作。

NumExpr可能會在您的問題細分中涵蓋#2。 如果使用可流式二進制格式解決#1問題,則可以在加載數據文件時使用chunked-read方法 - 如下所示:

    with open('path/to/your-data.bin', 'rb') as binary:
        while True:
            chunk = binary.read(4096) # or what have you
            if not chunk:
                break

如果這對你來說太低級,我建議你看看HDF5庫和格式: http//www.h5py.org - 這是我所知道的基於NumPy結構的二進制序列化的最佳解決方案。 h5py模塊支持壓縮,分塊讀取,dtypes,元數據...你可以命名它。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM