Я хочу зробити більш вичерпну відповідь, виходячи з більшості потенційних рішень, які вже надані. Я також хочу зазначити ще одну потенційну допомогу, яка може допомогти читати.
Варіант 1: типи
"dtypes" - досить потужний параметр, який можна використовувати для зниження тиску пам'яті read
методів. Дивіться це і це відповідь. Панди за замовчуванням намагаються зробити висновки про типи даних.
Посилаючись на структури даних, при кожному зберіганні даних відбувається розподіл пам'яті. На базовому рівні зверніться до наведених нижче значень (Таблиця нижче ілюструє значення для мови програмування на C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Зверніться до цього сторінці перегляньте відповідність між типами NumPy та C.
Скажімо , у вас є масив цілих чисел . Ви можете як теоретично, так і практично призначити, скажімо, масив 16-бітного цілочисельного типу, але тоді ви виділите більше пам'яті, ніж вам потрібно для зберігання цього масиву. Щоб цього не допустити, можна встановити dtype
параметр увімкнути read_csv
. Ви не хочете зберігати елементи масиву як довге ціле число, де насправді ви можете вмістити їх з 8-бітовим цілим числом ( np.int8
або np.uint8
).
Дотримуйтесь наступної мапи типу.
Джерело: https://pbpython.com/pandas_dtypes.html
Ви можете передавати dtype
параметр як параметр методів pandas у вигляді dict на read
зразок {column: type}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Варіант 2: Прочитайте Чанки
Читання даних по шматочках дозволяє отримати доступ до частини даних в пам'яті, і ви можете застосувати попередню обробку даних і зберегти оброблені дані, а не необроблені дані. Було б набагато краще, якщо ви поєднаєте цей варіант з першим, типом .
Я хочу вказати на розділи кухарської книги для цього процесу, де їх можна знайти тут . Зверніть увагу на ці два розділи там;
Варіант 3: Даск
Dask - це рамка, визначена на веб-сайті Dask як:
Dask надає розширений паралелізм для аналітики, що дозволяє виконувати масштабність інструментів, які ви любите
Він народився для покриття необхідних частин, куди панди не можуть дістатися. Dask - це потужна рамка, яка дозволяє набагато більше доступу до даних, обробляючи їх розподіленим способом.
Ви можете використовувати dask для попередньої обробки ваших даних в цілому, Dask піклується про фрагменти, тому на відміну від панд, ви можете просто визначити кроки обробки та дозволити Dask виконувати роботу. Dask не застосовує обчислення до того, як його явно натиснуть compute
та / або persist
(див. Відповідь тут для різниці).
Інші засоби (ідеї)
- Потік ETL, розроблений для даних. Зберігати лише те, що потрібно від необроблених даних.
- По-перше, застосуйте ETL до цілих даних із рамками, такими як Dask або PySpark, та експортуйте оброблені дані.
- Потім подивіться, чи можуть оброблені дані вміститися в пам'яті в цілому.
- Подумайте про збільшення оперативної пам’яті.
- Розглянемо роботу з цими даними на хмарній платформі.