2016-10-11 24 views
6

Hãy nói rằng tôi có một gấu trúc DataframeLàm thế nào để giới hạn kích thước truy vấn gấu trúc trên HDF5 để nó không vượt quá giới hạn RAM?

import pandas as pd 

df = pd.DataFrame() 

df 

    Column1 Column2 
0 0.189086 -0.093137 
1 0.621479 1.551653 
2 1.631438 -1.635403 
3 0.473935 1.941249 
4 1.904851 -0.195161 
5 0.236945 -0.288274 
6 -0.473348 0.403882 
7 0.953940 1.718043 
8 -0.289416 0.790983 
9 -0.884789 -1.584088 
........ 

Một ví dụ về truy vấn là df.query('Column1 > Column2')

Hãy nói rằng bạn muốn hạn chế sự tiết kiệm của truy vấn này, vì vậy các đối tượng không phải là quá lớn. Có cách nào "gấu trúc" để thực hiện việc này không?

Câu hỏi của tôi chủ yếu cho truy vấn ở đối tượng HDF5 có gấu trúc. Một đối tượng HDF5 có thể lớn hơn nhiều so với RAM, và do đó các truy vấn có thể lớn hơn RAM.

# file1.h5 contains only one field_table/key/HDF5 group called 'df' 
store = pd.HDFStore('file1.h5') 

# the following query could be too large 
df = store.select('df',columns=['column1', 'column2'], where=['column1==5']) 

Có cách nào để ngăn người dùng thực hiện truy vấn vượt quá một kích thước nhất định không?

+0

Bạn có muốn ngăn chặn chúng vì nó phá vỡ máy? Hay bạn muốn tìm cách để đạt được tính toán của mình mà không phá vỡ máy? Nếu sau này, dask phải là bạn của bạn – Boud

+0

những gì về việc sử dụng tham số 'chunksize' khi gọi' store.select (...) '? – MaxU

+0

@Boud Cả hai tùy chọn đều cần xem xét. Còn về cái gì? – ShanZhengYang

Trả lời

3

Đây là một cuộc biểu tình nhỏ về cách sử dụng các tham số chunksize khi gọi HDFStore.select():

for chunk in store.select('df', columns=['column1', 'column2'], 
          where='column1==5', chunksize=10**6): 
    # process `chunk` DF 
+0

Điều này không hoàn toàn trả lời câu hỏi của tôi, nhưng đây là một cách tiếp cận. Nếu tôi tích hợp PyTables vào phần mềm theo đó người dùng truy vấn 'HDFStore', tôi muốn truy vấn tiếp tục cho đến khi nó truy cập" quá nhiều hàng "--- sau đó, nó sẽ dừng lại và ném một lỗi. Ở trên là một giải pháp nếu tôi biết một ưu tiên rằng truy vấn là lớn, và tôi muốn phá vỡ nó. Tôi có giải thích rõ ràng vấn đề không? – ShanZhengYang

+0

@ ShanZhengYang, không có nó vẫn không khá rõ ràng với tôi ... Bạn có muốn ước tính một kích thước của kết quả DF trước khi đọc nó từ một cửa hàng? – MaxU

+0

Không nhất thiết, nhưng tôi nghi ngờ đó là cách tốt nhất để làm điều đó. Giả sử tôi thử 'df = store.select ('df', columns = ['column1', 'column2'], trong đó = ['column1 == 5'])' và nó lớn hơn một số giới hạn về RAM- --if giới hạn là giới hạn được thiết lập bởi độ cứng của máy tính, chương trình sẽ chỉ đóng băng. Giả sử tôi muốn đặt giới hạn tùy ý, ví dụ: 4 GB. HDF5 có thể là + TB hoặc PB, do đó, 'df' có thể dễ dàng vượt quá RAM nếu người dùng truy vấn đối tượng này. Tôi có thể đưa ra những hạn chế nào để ngăn chặn "những điều xấu" xảy ra? – ShanZhengYang

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