2016-10-11 10 views
6

Скажем, у меня есть панд DataframeКак ограничить размер запросов pandas на HDF5, чтобы он не превышал пределы 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 
........ 

Примером запроса df.query('Column1 > Column2')

Допустим, вы хотите, чтобы ограничить сохранения этого запроса, поэтому объект не был столь велик. Есть ли способ «панд» для этого?

Мой вопрос в первую очередь предназначен для запроса объекта HDF5 с помощью pandas. Объект HDF5 может быть намного больше, чем ОЗУ, и поэтому запросы могут быть больше, чем ОЗУ.

# 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']) 

Есть ли способ pandas/Pythonic остановить пользователей для выполнения запросов, превосходящих определенный размер?

+0

Вы хотите, чтобы остановить их, потому что он ломает машину? Или вы хотите найти способ по-прежнему достичь своих расчетов, не нарушая работу машины? Если последний, dask должен быть вашим другом – Boud

+0

, то как насчет использования параметра 'chunksize' при вызове' store.select (...) '? – MaxU

+0

@Boud Оба варианта - это то, что нужно учитывать. Как насчет первого? – ShanZhengYang

ответ

3

Вот небольшая демонстрация того, как использовать параметр chunksize при вызове HDFStore.select():

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

Это не совсем отвечает на мой вопрос, но это подход. Если я интегрирую PyTables в программное обеспечение, в котором пользователи будут запрашивать «HDFStore», я бы хотел, чтобы запрос продолжался до тех пор, пока он не попадет «слишком много строк», - тогда он остановится и выкинет ошибку. Вышеупомянутое решение, если я знаю априори, что запрос большой, и я хочу его разбить. Я ясно объясняю проблему? – ShanZhengYang

+0

@ShanZhengYang, нет, мне все еще не совсем понятно ... Вы хотите оценить размер результирующего DF, прежде чем читать его из магазина? – MaxU

+0

Не обязательно, но я подозреваю, что это лучший способ сделать это. Предположим, я попробовал 'df = store.select ('df', columns = ['column1', 'column2'], где = ['column1 == 5'])' и он больше некоторого предела с точки зрения RAM- - если предел является пределом, установленным жестким диском компьютера, программа просто замерзнет. Предположим, я хотел установить произвольный предел, например. 4ГБ. HDF5 может быть + TB или PB, поэтому 'df' может легко превысить ОЗУ, если пользователь должен был запросить этот объект. Какие ограничения я мог бы поставить, чтобы остановить «плохие вещи»? – ShanZhengYang