HDFStore: table.select и использование ОЗУ

Я пытаюсь выбрать случайные строки из таблицы HDFStore около 1 ГБ. Использование RAM взрывается, когда я запрашиваю около 50 случайных строк.

Я использую pandas 0-11-dev, python 2.7, linux64 .

В этом первом случае использование ОЗУ соответствует размеру chunk

 with pd.get_store("train.h5",'r') as train: for chunk in train.select('train',chunksize=50): pass 

В этом втором случае кажется, что вся таблица загружена в ОЗУ

 r=random.choice(400000,size=40,replace=False) train.select('train',pd.Term("index",r)) 

В этом последнем случае использование ОЗУ соответствует эквивалентному размеру chunk

 r=random.choice(400000,size=30,replace=False) train.select('train',pd.Term("index",r)) 

Я озадачен, почему перемещение от 30 до 40 случайных строк вызывает такое резкое увеличение использования ОЗУ.

Обратите внимание, что таблица была проиндексирована при создании так, что index = range (nrows (table)), используя следующий код:

 def txtfile2hdfstore(infile, storefile, table_name, sep="\t", header=0, chunksize=50000 ): max_len, dtypes0 = txtfile2dtypes(infile, sep, header, chunksize) with pd.get_store( storefile,'w') as store: for i, chunk in enumerate(pd.read_table(infile,header=header,sep=sep,chunksize=chunksize, dtype=dict(dtypes0))): chunk.index= range( chunksize*(i), chunksize*(i+1))[:chunk.shape[0]] store.append(table_name,chunk, min_itemsize={'values':max_len}) 

Спасибо за понимание

ИЗМЕНИТЬ ОТВЕТЬ Zelazny7

Вот файл, который я использовал для записи Train.csv на train.h5. Я написал это с использованием элементов кода Zelazny7 от « Как справиться с проблемой HDFStore Exception: не могу найти правильный тип атома»

 import pandas as pd import numpy as np from sklearn.feature_extraction import DictVectorizer def object_max_len(x): if x.dtype != 'object': return else: return len(max(x.fillna(''), key=lambda x: len(str(x)))) def txtfile2dtypes(infile, sep="\t", header=0, chunksize=50000 ): max_len = pd.read_table(infile,header=header, sep=sep,nrows=5).apply( object_max_len).max() dtypes0 = pd.read_table(infile,header=header, sep=sep,nrows=5).dtypes for chunk in pd.read_table(infile,header=header, sep=sep, chunksize=chunksize): max_len = max((pd.DataFrame(chunk.apply( object_max_len)).max(),max_len)) for i,k in enumerate(zip( dtypes0[:], chunk.dtypes)): if (k[0] != k[1]) and (k[1] == 'object'): dtypes0[i] = k[1] #as of pandas-0.11 nan requires a float64 dtype dtypes0.values[dtypes0 == np.int64] = np.dtype('float64') return max_len, dtypes0 def txtfile2hdfstore(infile, storefile, table_name, sep="\t", header=0, chunksize=50000 ): max_len, dtypes0 = txtfile2dtypes(infile, sep, header, chunksize) with pd.get_store( storefile,'w') as store: for i, chunk in enumerate(pd.read_table(infile,header=header,sep=sep,chunksize=chunksize, dtype=dict(dtypes0))): chunk.index= range( chunksize*(i), chunksize*(i+1))[:chunk.shape[0]] store.append(table_name,chunk, min_itemsize={'values':max_len}) 

Применяется как

 txtfile2hdfstore('Train.csv','train.h5','train',sep=',') 

  • как работают переменные модуля python?
  • Является ли os.popen действительно устаревшим в Python 2.6?
  • Различия между методами класса, которые являются «функциями» и которые «связаны методом»?
  • Шаблоны Django: отображение даты, только если она в будущем
  • Как использовать шаблон регулярного выражения nltk для извлечения определенного фрагмента фразы?
  • Словарь как таблица в шаблоне Django
  • Как создать список 1d с .txt с \ n?
  • Переменный поиск: почему ** с переменными намного медленнее, чем со значениями
  • One Solution collect form web for “HDFStore: table.select и использование ОЗУ”

    Это известная проблема, см. Ссылку здесь: https://github.com/pydata/pandas/pull/2755

    По сути запрос преобразуется в выражение numexpr для оценки. Существует проблема, когда я не могу передать много or условий для numexpr (зависит от общей длины сгенерированного выражения).

    Поэтому я просто ограничиваю выражение, которое мы передаем numexpr. Если он превышает определенное количество or условия, запрос выполняется как фильтр, а не в ядре. В основном это означает, что таблица читается, а затем повторно индексируется.

    Это список моих улучшений: https://github.com/pydata/pandas/issues/2391 (17).

    В качестве обходного решения просто разделите свои запросы на несколько и выполните результаты. Должно быть намного быстрее и использовать постоянный объем памяти

    Python - лучший язык программирования в мире.