2013-08-13 40 views
5

OK Tôi đang thử nghiệm với gấu trúc để tải xung quanh một tập tin csv 30GB với 40 triệu + hàng và 150 + cột vào HDFStore. Phần lớn các cột là chuỗi, theo sau là số và ngày tháng.Pandas HDFStore tải dataframe từ bộ nhớ

Tôi chưa bao giờ thực sự sử dụng NumPy, gấu trúc hoặc pytables trước nhưng đã chơi xung quanh với khung dữ liệu trong R.

Tôi hiện chỉ lưu trữ một tập tin mẫu khoảng 20000 dòng trong để HDFStore. Khi tôi cố gắng đọc bảng từ HDFStore bảng được nạp vào bộ nhớ và sử dụng bộ nhớ tăng lên bởi ~ 100MB

f=HDFStore('myfile.h5') 
g=f['df'] 

Sau đó, tôi xóa các biến chứa DataFrame:

del g 

Tại điểm sử dụng bộ nhớ giảm đi khoảng 5MB

Nếu tôi một lần nữa nạp dữ liệu vào g sử dụng g=f['df'], sử dụng bộ nhớ bắn lên 100MB khác

Clea nup chỉ xảy ra khi tôi thực sự đóng cửa sổ.

Cách dữ liệu được sắp xếp, có lẽ tôi sẽ chia dữ liệu thành các bảng riêng lẻ với kích thước bảng tối đa khoảng 1 GB có thể vừa với bộ nhớ và sau đó sử dụng từng dữ liệu một. Tuy nhiên, cách tiếp cận này sẽ không hoạt động nếu tôi không thể xóa bộ nhớ.

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

+0

Bạn đã đọc nội dung này? (Hiển thị chức năng lấy dữ liệu từ tệp csv và tạo cửa hàng theo khối, cũng như phân tích cú pháp ngày): http://stackoverflow.com/questions/16110252/need-to-compare-very-large-files-around -1-5gb-in-python/16110391 # 16110391 – Mattijn

+1

Bạn cần đóng cửa hàng. Có tài liệu mở rộng về việc sử dụng '' HDFStore'' [ở đây] (http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables) – Jeff

+0

bất kỳ cập nhật nào về điều này? Tôi đang gặp vấn đề tương tự. và '' f.close() '' không thay đổi việc sử dụng bộ nhớ trong trường hợp của tôi – sanguineturtle

Trả lời

2

Để trả lời vào điểm thứ hai của câu hỏi OP của ("làm thế nào để bộ nhớ giải phóng")

Câu trả lời ngắn

Đóng cửa và xóa các dataframe chọn không làm việc, tuy nhiên tôi thấy một cuộc gọi để gc.collect() xóa bộ nhớ tốt sau khi bạn xóa khung dữ liệu.

Ví dụ

Trong ví dụ dưới đây, bộ nhớ được làm sạch tự động như mong đợi:

data=numpy.random.rand(10000,1000)   # memory up by 78MB 
df=pandas.DataFrame(data)     # memory up by 1 MB 

store = pandas.HDFStore('test.h5')   # memory up by 3 MB 
store.append('df', df)      # memory up by 9 MB (why?!?!) 

del data         # no change in memory 
del df          # memory down by 78 MB 

store.close()        # no change in memory 
gc.collect()        # no change in memory (1) 

(1) cửa hàng vẫn còn trong trí nhớ, mặc dù đóng

Bây giờ giả sử chúng ta tiếp tục từ trên cao và mở lại store như sau. Bộ nhớ được làm sạch chỉ sau GC.Collect() được gọi:

store = pandas.HDFStore('test.h5')   # no change in memory (2) 
df = store.select('df')     # memory up by 158MB ?! (3) 
del df          # no change in memory 
store.close()        # no change in memory 
gc.collect()        # memory down by 158 MB (4) 

(2) các cửa hàng không bao giờ rời đi, (3) Tôi đã đọc rằng lựa chọn của một bảng migth mất càng nhiều càng 3x các sixe của bảng, (4) cửa hàng vẫn còn đó

Cuối cùng tôi cũng đã cố gắng thực hiện .copy() của df khi mở (df = store.select('df')). Không làm điều này, nó tạo ra một con quái vật trong bộ nhớ mà không thể được thu gom rác sau đó.

cuối cùng câu hỏi Nếu DF trong bộ nhớ là 100MB, tôi hiểu rằng có thể chiếm kích thước 2-3x trong bộ nhớ trong khi tải nhưng tại sao nó tại 200MB trong bộ nhớ sau khi tôi chọn nó từ một HDFStore và gần gũi cửa hàng?