2013-03-13 23 views
7

Tôi có tính toán dài mà tôi lặp lại nhiều lần. Do đó, tôi muốn sử dụng ghi nhớ (các gói như jugjoblib), trong buổi hòa nhạc với Pandas. Vấn đề là liệu gói đó có ghi nhớ tốt các tham số của phương thức Pandas DataFrames hay không.Ghi nhớ Pandas

Có ai đã thử không? Có cách nào khác được đề nghị gói/cách để làm điều này?

Trả lời

6

Tác giả của bình ở đây: jug hoạt động tốt. Tôi chỉ cố gắng sau đây và nó hoạt động:

from jug import TaskGenerator 
import pandas as pd 
import numpy as np 


@TaskGenerator 
def gendata(): 
    return pd.DataFrame(np.arange(343440).reshape((10,-1))) 

@TaskGenerator 
def compute(x): 
    return x.mean() 

y = compute(gendata()) 

Nó không phải là hiệu quả như nó có thể là vì nó chỉ sử dụng pickle nội bộ cho DataFrame (mặc dù nó nén nó một cách nhanh chóng, vì vậy nó không phải là khủng khiếp về sử dụng bộ nhớ, chỉ chậm hơn mức có thể).

Tôi sẽ mở cho một thay đổi tiết kiệm những trường hợp này như một trường hợp đặc biệt như bình hiện tại cho các mảng có nhiều mảng: https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

+0

Và điều gì sẽ xảy ra khi bạn gọi' tính toán (gendata()) '? Liệu nó có thực sự nạp DataFrame từ bộ nhớ đệm? – Yariv

+0

Nếu' ' gendata() '' được tính toán trong một quá trình khác, sau đó có – luispedro

+0

Có cách nào để chạy jug với lệnh 'python' thay vì' jug'? – Light

4

Tôi sử dụng trình trang trí ghi nhớ cơ bản này, memoized. http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

DataFrames có thể băm, vì vậy nó sẽ hoạt động tốt. Đây là một ví dụ.

In [2]: func = lambda df: df.apply(np.fft.fft) 

In [3]: memoized_func = memoized(func) 

In [4]: df = DataFrame(np.random.randn(1000, 1000)) 

In [5]: %timeit func(df) 
10 loops, best of 3: 124 ms per loop 

In [9]: %timeit memoized_func(df) 
1000000 loops, best of 3: 1.46 us per loop 

Có vẻ tốt với tôi.

+0

Cảm ơn. Ý bạn là gì bởi "DataFrames có thể băm"? 'hash (pd.DataFrame ([1,2,3]))' trả về một giá trị khác nếu bạn gọi nó hai lần. – Yariv

+0

Mã cho bộ sưu tập séc đã ghi nhớ.Hashable() trước khi nó cố gắng lưu vào bộ nhớ cache dữ liệu. Nhưng bình luận của bạn là làm cho tôi xem xét lại cho dù điều này hoạt động như dự định. –

+0

DataFrame có lẽ nên tăng trong trường hợp này, tôi sẽ đưa ra pr trên github –