ฉันต้องการที่จะทำให้คำตอบที่ครอบคลุมมากขึ้นโดยใช้โซลูชั่นที่มีศักยภาพที่มีอยู่แล้วให้มากที่สุด ฉันยังต้องการชี้ให้เห็นความช่วยเหลือที่เป็นไปได้อีกหนึ่งอย่างที่อาจช่วยกระบวนการอ่าน
ตัวเลือกที่ 1: dtypes
"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
)
สังเกตแผนที่ dtype ต่อไปนี้
ที่มา: 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: อ่านโดย Chunks
การอ่านข้อมูลเป็นกลุ่มช่วยให้คุณเข้าถึงส่วนหนึ่งของข้อมูลในหน่วยความจำและคุณสามารถใช้การประมวลผลล่วงหน้ากับข้อมูลของคุณและเก็บรักษาข้อมูลที่ประมวลผลไว้แทนที่จะเป็นข้อมูลดิบ มันจะดีกว่ามากถ้าคุณรวมตัวเลือกนี้เข้ากับdtypes ตัวแรก
ผมอยากจะชี้ให้เห็นแพนด้าตำราส่วนสำหรับกระบวนการที่ที่คุณสามารถค้นหาได้ที่นี่ สังเกตสองส่วนนั้น
ตัวเลือก 3: Dask
Dask เป็นกรอบงานที่กำหนดไว้ในเว็บไซต์ของ Daskดังนี้
Dask ให้ความเท่าเทียมขั้นสูงสำหรับการวิเคราะห์ช่วยให้ประสิทธิภาพในระดับที่เครื่องมือที่คุณชื่นชอบ
มันเกิดมาเพื่อปกปิดส่วนที่จำเป็นที่แพนด้าไม่สามารถเข้าถึงได้ Dask เป็นเฟรมเวิร์กที่ทรงพลังที่ช่วยให้คุณเข้าถึงข้อมูลได้มากขึ้นโดยการประมวลผลในแบบกระจาย
คุณสามารถใช้ dask เพื่อประมวลผลข้อมูลของคุณโดยรวมได้ Dask ดูแลส่วนที่เป็นก้อนดังนั้นไม่เหมือนกับแพนด้าที่คุณสามารถกำหนดขั้นตอนการประมวลผลและปล่อยให้ Dask ทำงานได้ Dask ไม่ได้ใช้การคำนวณก่อนที่จะถูกผลักดันอย่างชัดเจนโดยcompute
และ / หรือpersist
(ดูคำตอบที่นี่สำหรับความแตกต่าง)
เอดส์อื่น ๆ (ความคิด)
- ETL flow ออกแบบมาสำหรับข้อมูล เก็บเฉพาะสิ่งที่จำเป็นจากข้อมูลดิบ
- ก่อนอื่นให้ใช้ ETL กับข้อมูลทั้งหมดด้วยเฟรมเวิร์กเช่น Dask หรือ PySpark และส่งออกข้อมูลที่ประมวลผล
- จากนั้นดูว่าข้อมูลที่ประมวลผลนั้นสามารถใส่ลงในหน่วยความจำทั้งหมดได้หรือไม่
- พิจารณาเพิ่ม RAM ของคุณ
- ลองพิจารณาทำงานกับข้อมูลนั้นบนแพลตฟอร์มคลาวด์