2013-09-10 18 views
8

Tôi mới dùng python. Tôi có một mảng lớn, a, với các kích thước như (43200, 4000) và tôi cần lưu điều này, vì tôi cần nó để xử lý trong tương lai. khi tôi cố gắng lưu nó với np.savetxt, tệp txt quá lớn và chương trình của tôi chạy vào lỗi bộ nhớ khi tôi cần xử lý 5 tệp có cùng kích thước. Có cách nào để lưu mảng lớn để nó sẽ mất ít bộ nhớ hơn?Làm thế nào để lưu mảng lớn để nó sẽ mất ít bộ nhớ trong python?

Cảm ơn.

+3

Bạn đã thử 'np.savetxt ('file.npy.gz')'? Nó sẽ mất nhiều thời gian hơn để tiết kiệm và sau đó tải (vì nén), nhưng nó sẽ làm giảm đáng kể kích thước của tập tin. – wflynny

+0

@ Cảm ơn bạn đã trả lời, chỉ cần thử với np.savetxt ('file.npy.gz') và nó giảm kích thước tệp của tôi nhưng không thể tải lại dữ liệu. – user2766019

+0

Bạn có chắc là bạn đã tải tệp có cùng phần mở rộng tệp mà bạn đã lưu không? 'np.loadtxt ('file.npy.gz')'. – wflynny

Trả lời

3

Bạn có thể sử dụng PyTables để tạo tệp Định dạng dữ liệu phân cấp (HDF) để lưu trữ dữ liệu. Điều này cung cấp một số thú vị tùy chọn trong bộ nhớ liên kết các đối tượng bạn đang làm việc với các tập tin đó sẽ được lưu trong

Dưới đây là một câu hỏi StackOverflow đó chứng tỏ làm thế nào để làm điều này:. "How to store a NumPy multidimensional array in PyTables."

Nếu bạn sẵn sàng làm việc với mảng của bạn như là một đối tượng Pandas DataFrame, bạn cũng có thể sử dụng giao diện Pandas để PyTables/HDF5, ví dụ:

import pandas 
import numpy as np 
a = np.ones((43200, 4000)) # Not recommended. 
x = pandas.HDFStore("some_file.hdf") 

x.append("a", pandas.DataFrame(a)) # <-- This will take a while. 
x.close() 

# Then later on... 
my_data = pandas.HDFStore("some_file.hdf") # might also take a while 
usable_a_copy = my_data["a"] # Be careful of the way changes to 
          # `usable_a_copy` affect the saved data. 

copy_as_nparray = usable_a_copy.values 

với các file kích thước này, bạn có thể xem xét liệu ứng dụng của bạn có thể được thực hiện với một thuật toán song song và có khả năng được áp dụng cho các tập hợp con của các mảng lớn chứ không phải hơn là cần phải tiêu thụ tất cả các mảng trước khi tiếp tục.

10

Lưu dữ liệu của bạn vào tệp văn bản cực kỳ kém hiệu quả. Numpy có các lệnh tiết kiệm được tích hợp sẵn savesavez/savez_compressed sẽ phù hợp hơn để lưu trữ các mảng lớn.

Tùy thuộc vào cách bạn định sử dụng dữ liệu, bạn cũng nên xem định dạng HDF5 (h5py hoặc pytables), cho phép bạn lưu trữ các tập dữ liệu lớn mà không phải tải tất cả trong bộ nhớ.