2015-02-02 17 views
11

Tôi có một tệp npz 3.374Gb, myfile.npz.Tại sao mảng numpy này quá lớn để tải?

tôi có thể đọc nó và xem các tên tập tin:

a = np.load('myfile.npz') 
a.files 

cho

['arr_1','arr_0'] 

tôi có thể đọc trong 'arr_1' ok

a1=a['arr_1'] 

Tuy nhiên, tôi không thể tải trong arr_0 hoặc đọc hình dạng của nó:

a1=a['arr_0'] 
a['arr_0'].shape 

cả các hoạt động trên cung cấp cho các lỗi sau:

ValueError: array is too big 

Tôi có 16Gb RAM trong đó 8.370Gb có sẵn. Vì vậy, vấn đề dường như không liên quan đến bộ nhớ. Câu hỏi của tôi là:

  1. Tôi có thể đọc tệp này không?

  2. Có ai có thể giải thích lỗi này không?

  3. Tôi đã xem xét sử dụng np.memmap để giải quyết vấn đề này - đây có phải là phương pháp hợp lý không?

  4. Tôi nên sử dụng phương pháp gỡ lỗi nào?

EDIT:

tôi có quyền truy cập vào một máy tính với RAM hơn (48GB) và nó được nạp. dtype thực tế là complex128 và bộ nhớ không nén của a['arr_0'] là 5750784000 byte. Có vẻ như một chi phí RAM có thể được yêu cầu. Hoặc là số lượng dự đoán của tôi về RAM có sẵn là sai (tôi đã sử dụng Windows sysinternals RAMmap).

+1

tôi nghi ngờ lý do bạn có thể 't tải nó là bởi vì đại diện, ví dụ, 3.4 như một phao trong bộ nhớ máy tính đòi hỏi nhiều bộ nhớ hơn tiết kiệm 3,4 trên đĩa. Nhưng tôi ít chắc chắn về điều đó hơn trước khi tôi bắt đầu đọc nó. – Joel

+0

Bạn có biết tệp đó đã được nén hay không (được tạo bằng cách sử dụng ['np.savez_compressed()'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.savez_compressed.html#numpy. savez_compressed))? Bạn đã tạo nó trên cùng một máy mà bạn đang cố tải nó lên chưa? Bạn có biết loại mảng nào chứa (kích thước và kiểu chữ) không? –

+0

@ali_m, có được lưu với 'np.savez_compressed' nhưng trên một máy khác. Các 'arr_0' là nổi (tôi nghĩ 8 byte) của hình dạng' (200,1440,3,12,32) ',' arr_1' là (200,3,32) một lần nữa nổi. – atomh33ls

Trả lời

2

Một np.complex128 mảng với kích thước (200, 1440, 3, 13, 32) phải mất khoảng 5.35GiB không nén, vì vậy nếu bạn thực sự đã có 8.3GB miễn phí, bộ nhớ địa chỉ sau đó về nguyên tắc bạn nên để có thể tải mảng.

Tuy nhiên, dựa trên câu trả lời của bạn trong phần nhận xét bên dưới, bạn đang sử dụng phiên bản 32 bit của Python và có nhiều vần. Trong Windows, a 32 bit process can only address up to 2GB of memory (hoặc 4GB nếu nhị phân được biên dịch với cờ IMAGE_FILE_LARGE_ADDRESS_AWARE; hầu hết các bản phân phối Python 32 bit không). Do đó, quá trình Python của bạn được giới hạn ở 2GB không gian địa chỉ bất kể bạn có bao nhiêu bộ nhớ vật lý.

Bạn có thể cài đặt phiên bản 64 bit của Python, gọn gàng và bất kỳ thư viện Python nào khác mà bạn cần hoặc sống với giới hạn 2GB và cố gắng giải quyết nó. Trong trường hợp thứ hai, bạn có thể thoát khỏi mảng lưu trữ vượt quá giới hạn 2GB chủ yếu trên đĩa (ví dụ: sử dụng np.memmap), nhưng tôi khuyên bạn nên chọn tùy chọn # 1, vì các hoạt động trên mảng được ghi nhớ chậm hơn rất nhiều trong hầu hết các trường hợp so với bình thường np.array s nằm hoàn toàn trong RAM.


Nếu bạn đã có một máy tính mà có đủ RAM để nạp toàn bộ mảng vào bộ nhớ lõi sau đó tôi sẽ đề nghị bạn tiết kiệm mảng trong một định dạng khác nhau (hoặc là một np.memmap nhị phân đơn giản, hoặc có lẽ tốt hơn, trong tệp HDF5 sử dụng PyTables hoặc H5py). Cũng có thể (mặc dù hơi phức tạp hơn) để trích xuất các mảng vấn đề từ các tập tin .npz mà không cần nạp nó vào RAM, do đó bạn có thể mở nó như một mảng np.memmap nằm trên đĩa:

import numpy as np 

# some random sparse (compressible) data 
x = np.random.RandomState(0).binomial(1, 0.25, (1000, 1000)) 

# save it as a compressed .npz file 
np.savez_compressed('x_compressed.npz', x=x) 

# now load it as a numpy.lib.npyio.NpzFile object 
obj = np.load('x_compressed.npz') 

# contains a list of the stored arrays in the format '<name>.npy' 
namelist = obj.zip.namelist() 

# extract 'x.npy' into the current directory 
obj.zip.extract(namelist[0]) 

# now we can open the array as a memmap 
x_memmap = np.load(namelist[0], mmap_mode='r+') 

# check that x and x_memmap are identical 
assert np.all(x == x_memmap[:]) 
+0

Tôi nghi ngờ một mảng có thể yêu cầu một phạm vi tiếp giáp của không gian bộ nhớ ảo, ít nhất là đối với một số phần của nó. –

+1

Tôi cũng có thể là anh ta đang sử dụng một quá trình x32 được giới hạn trong không gian địa chỉ 4GB. –

+0

@ atomh33ls bạn có thể xác nhận xem bạn đang chạy Windows 32 bit hay bị giới hạn không gian địa chỉ 4GB? Bạn có thể phân bổ mảng numpy 4GB mới (ví dụ: 'foo = np.ones (536870912, np.float64)') không? –

Các vấn đề liên quan