2016-02-01 5 views
2

Я получаю «Ошибка памяти» на Python при попытке сортировать фрейм данных Pandas и затем сохранять его на диске.Ошибка памяти Python 64bits

df = pd.read_hdf('big_df_file.h5') 
df.sort_values(by='opt',inplace=True,kind='quicksort') 
df.to_hdf('sorted.h5') 

Мой компьютер имеет 16 ГБ ОЗУ, а файл данных - 8 ГБ. Разве я не могу это сделать, не получив «Ошибка памяти»?

P.S. Я использую quicksort, потому что это алгоритм сортировки, который выделяет меньше памяти.

Versions: 
python: 2.7.11.final.0 
python-bits: 64 
OS: Windows 
OS-release: 10 
machine: AMD64 
processor: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel 
byteorder: little 
LC_ALL: None 
LANG: en_GB 

pandas: 0.17.1 
+0

* Когда * вы получаете 'MemoryError'? Вы уверены, что это дает вам ошибку при сортировке, а не при загрузке данных? – Bakuriu

+0

@Bakuriu Я поместил несколько выражений 'print' и получаю ошибку при сортировке. –

+0

['numpy.sort'] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.sort.html) говорится, что сортировка на любой, кроме последней оси, может создавать временные копии данных. Однако, используя простой «numpy», я не вижу больших изменений в памяти. Фактически даже при использовании 'mergesort' я не вижу реальных изменений в использовании памяти. – Bakuriu

ответ

0

Нам нужна дополнительная информация, на какой стадии вызывается MemoryError? Какой тип данных загружен? насколько это действительно необходимо для выполнения сортировки?

Однако я попытаюсь решить эту проблему.

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

Еще более «хардкорный» подход был бы делением и победой (двоичный алгоритм сортировки, такой как сортировка слияния), загружать только половину файла (или четверть, вы решаете, что лучше всего работает, в соответствии с docs это возможно путем передачи аргументов start и stop) и выполнить выбранный алгоритм сортировки (сортировка слияния или внешняя сортировка).

Более подробная информация об общей проблеме была предоставлена ​​this answer

Смежные вопросы