Cách đọc tệp 1TB bằng Python

Vấn đề. Nhập [đọc] tệp CSV lớn dẫn đến lỗi Hết bộ nhớ. Không đủ RAM để đọc toàn bộ CSV cùng một lúc làm hỏng máy tính

Dưới đây là một số cách hiệu quả để nhập CSV bằng Python

Hình 1

Bây giờ thì sao? .
Bắt đầu nào. 🏃

Tạo một khung dữ liệu gồm 15 cột và 10 triệu hàng với các số và chuỗi ngẫu nhiên. Xuất nó sang định dạng CSV có kích thước khoảng ~ 1 GB

df = pd.DataFrame[data=np.random.randint[99999, 99999999, size=[10000000,14]],columns=['C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','C13','C14']]df['C15'] = pd.util.testing.rands_array[5,10000000]
df.to_csv["huge_data.csv"]

Bây giờ, hãy xem xét các tùy chọn nhập và so sánh thời gian cần thiết để đọc CSV vào bộ nhớ

GẤU TRÚC

Thư viện pandas python cung cấp hàm read_csv[] để nhập CSV dưới dạng cấu trúc khung dữ liệu để tính toán hoặc phân tích dễ dàng. Hàm này cung cấp một tham số được mô tả trong phần sau để nhập tệp khổng lồ của bạn nhanh hơn nhiều

1. gấu trúc. read_csv[]

Đầu vào. Đọc tệp CSV
Đầu ra. khung dữ liệu gấu trúc

gấu trúc. read_csv[] tải toàn bộ tệp CSV cùng một lúc vào bộ nhớ trong một khung dữ liệu duy nhất

start = time.time[]
df = pd.read_csv['huge_data.csv']
end = time.time[]
print["Read csv without chunks: ",[end-start],"sec"]
Read csv without chunks: 26.88872528076172 sec

Điều này đôi khi có thể làm hỏng hệ thống của bạn do lỗi OOM [Hết bộ nhớ] nếu kích thước CSV lớn hơn kích thước bộ nhớ [RAM] của bạn. Giải pháp được cải thiện bằng cách nhập tiếp theo

2. gấu trúc. read_csv[cỡ khối]

Đầu vào. Đọc tệp CSV
Đầu ra. khung dữ liệu gấu trúc

Thay vì đọc toàn bộ CSV cùng một lúc, các đoạn CSV được đọc vào bộ nhớ. Kích thước của một đoạn được chỉ định bằng tham số chunksize đề cập đến số lượng dòng. Hàm này trả về một trình lặp để lặp qua các khối này và sau đó xử lý chúng một cách mong muốn. Vì chỉ một phần của tệp lớn được đọc cùng một lúc nên bộ nhớ thấp là đủ để chứa dữ liệu. Sau đó, các khối này có thể được nối trong một khung dữ liệu duy nhất

start = time.time[]
#read data in chunks of 1 million rows at a time
chunk = pd.read_csv['huge_data.csv',chunksize=1000000]
end = time.time[]
print["Read csv with chunks: ",[end-start],"sec"]
pd_df = pd.concat[chunk]
Read csv with chunks: 0.013001203536987305 sec

Tùy chọn này nhanh hơn và tốt nhất nên sử dụng khi bạn có RAM hạn chế. Ngoài ra, một thư viện python mới, DASK cũng có thể được sử dụng, được mô tả bên dưới

DASK

Đầu vào. Đọc tệp CSV
Đầu ra. Khung dữ liệu Dask

Khi đọc các tệp CSV lớn, bạn có thể gặp phải lỗi hết bộ nhớ nếu nó không vừa với RAM của bạn, do đó DASK xuất hiện

  • Dask là một thư viện python nguồn mở với các tính năng song song và khả năng mở rộng trong Python được bao gồm theo mặc định trong bản phân phối Anaconda
  • Nó mở rộng các tính năng của nó ngoài khả năng mở rộng và tính song song bằng cách sử dụng lại các thư viện Python hiện có như pandas, numpy hoặc sklearn. Điều này tạo sự thoải mái cho những người đã quen thuộc với các thư viện Python này
  • Làm thế nào để bắt đầu với nó? . Tôi muốn giới thiệu conda vì cài đặt qua pip có thể tạo ra một số vấn đề
pip install dask

Chà, khi tôi thử cách trên, nó đã tạo ra một số vấn đề sau đó, vấn đề này đã được giải quyết bằng cách sử dụng một số liên kết GitHub để thêm đường dẫn dask bên ngoài làm biến môi trường. Nhưng tại sao phải làm ầm lên khi có sẵn một tùy chọn đơn giản hơn?

conda install dask
  • triển khai mã
from dask import dataframe as ddstart = time.time[]
dask_df = dd.read_csv['huge_data.csv']
end = time.time[]
print["Read csv with dask: ",[end-start],"sec"]
Read csv with dask: 0.07900428771972656 sec

Dask dường như là cách nhanh nhất để đọc tệp CSV lớn này mà không làm hỏng hoặc làm chậm máy tính. Ồ. Làm thế nào tốt là điều đó?. Một thư viện Python mới với những cái hiện có đã được sửa đổi để giới thiệu khả năng mở rộng

Tại sao DASK tốt hơn PANDAS?

  • Pandas sử dụng một lõi CPU duy nhất trong khi Dask sử dụng nhiều lõi CPU bằng cách chia nhỏ khung dữ liệu bên trong và xử lý song song. Nói một cách đơn giản, nhiều khung dữ liệu nhỏ của một khung dữ liệu lớn đã được xử lý tại một thời điểm trong đó dưới gấu trúc, việc vận hành một khung dữ liệu lớn duy nhất mất nhiều thời gian để chạy
  • DASK có thể xử lý các tập dữ liệu lớn trên một CPU khai thác nhiều lõi hoặc cụm máy của nó đề cập đến điện toán phân tán. Nó cung cấp một loại gấu trúc được chia tỷ lệ và thư viện numpy
  • Không chỉ dataframe, dask còn cung cấp các thư viện mảng và scikit-learning để khai thác song song

Một số thư viện do DASK cung cấp được hiển thị bên dưới

  • Mảng Dask. song song
  • Khung dữ liệu Dask. gấu trúc song song
  • Da ML. song song Scikit-Learn

Chúng tôi sẽ chỉ tập trung vào Dataframe vì hai cái còn lại nằm ngoài phạm vi. Tuy nhiên, để làm bẩn tay bạn với những thứ đó, blog này là tốt nhất để xem xét

Làm thế nào Dask quản lý để lưu trữ dữ liệu lớn hơn bộ nhớ [RAM]?

Khi chúng tôi nhập dữ liệu, dữ liệu sẽ được đọc vào RAM, điều này làm nổi bật giới hạn bộ nhớ.
Giả sử bạn muốn nhập dữ liệu 6 GB vào RAM 4 GB của mình. Điều này không thể đạt được thông qua gấu trúc vì toàn bộ dữ liệu trong một lần chụp không vừa với bộ nhớ nhưng Dask có thể. Bằng cách nào?
Dask thay vì tính toán trước, hãy tạo một biểu đồ nhiệm vụ nói về cách thực hiện nhiệm vụ đó. Nó tin vào tính toán lười biếng, điều đó có nghĩa là bộ lập lịch tác vụ của dask lúc đầu tạo một biểu đồ, sau đó tính toán biểu đồ đó khi được yêu cầu. Để thực hiện bất kỳ tính toán nào, tính toán [] được gọi một cách rõ ràng để gọi bộ lập lịch tác vụ để xử lý dữ liệu bằng cách sử dụng tất cả các lõi và cuối cùng, kết hợp các kết quả thành một.

Sẽ không khó hiểu với những ai đã quen với gấu trúc

Tôi không thể kiềm chế được sự tò mò trong việc học hỏi, vì vậy tôi rất vui được xuất bản Dask cho Python và Machine Learning với nghiên cứu sâu hơn

Phần kết luận

Việc đọc ~1 GB CSV trong bộ nhớ với nhiều tùy chọn nhập khác nhau có thể được đánh giá bằng thời gian tải vào bộ nhớ

gấu trúc. read_csv tệ nhất khi đọc CSV có kích thước lớn hơn RAM.
gấu trúc. read_csv[chunksize] hoạt động tốt hơn ở trên và có thể được cải thiện nhiều hơn bằng cách điều chỉnh chunksize.
dask. dataframe được chứng minh là nhanh nhất vì nó xử lý song song.

Do đó, tôi khuyên bạn nên ra khỏi vùng thoải mái của mình khi sử dụng pandas và thử dask. Nhưng chỉ FYI, tôi chỉ kiểm tra DASK để đọc CSV lớn chứ không phải tính toán như chúng tôi làm trong gấu trúc

Làm cách nào để đọc tệp 100gb bằng Python?

Đọc tệp văn bản lớn bằng Python . Trình vòng lặp sẽ trả về từng dòng một, có thể được xử lý. Điều này sẽ không đọc toàn bộ tệp vào bộ nhớ và nó phù hợp để đọc các tệp lớn trong Python. use the file object as an iterator. The iterator will return each line one by one, which can be processed. This will not read the whole file into memory and it's suitable to read large files in Python.

Làm cách nào để đọc tệp 10gb bằng Python?

Cách nhanh nhất của Python để đọc tệp văn bản lớn [vài GB] .
# Tập tin. readline-ví dụ-3. py
tệp = mở ["mẫu. txt"]
trong khi 1
dòng = tập tin. đường đọc[100000]
nếu không dòng
nghỉ
cho dòng trong dòng
vượt qua # làm gì đó**văn bản mạnh**

Làm cách nào để đọc tệp CSV 10gb bằng Python?

GẤU TRÚC .
gấu trúc. read_csv[] Đầu vào. Đọc tệp CSV. đầu ra. khung dữ liệu gấu trúc. gấu trúc. read_csv[] tải toàn bộ tệp CSV cùng một lúc vào bộ nhớ trong một khung dữ liệu duy nhất. .
gấu trúc. read_csv[chunksize] Đầu vào. Đọc tệp CSV. đầu ra. khung dữ liệu gấu trúc. Thay vì đọc toàn bộ CSV cùng một lúc, các đoạn CSV được đọc vào bộ nhớ

Làm thế nào để đọc các tập tin lớn?

Giải pháp 1. Tải xuống Trình xem tệp lớn chuyên dụng . Những công cụ như vậy sẽ mở các tệp văn bản lớn một cách dễ dàng

Chủ Đề