Hướng dẫn can python handle 1 billion rows? - python có thể xử lý 1 tỷ hàng không?

Sử dụng pytubes, numpy và matplotlib

Trình xem Google Ngram là một công cụ thú vị/hữu ích sử dụng dữ liệu khổng lồ của Google được quét từ sách để vẽ cách sử dụng từ theo thời gian. Lấy ví dụ, từ python (trường hợp nhạy cảm):

Đồ thị chưa có tiêu đề được lấy từ: https://books.google.com/ngrams/graph?content=python&year_start=1800&corpus=15&smoothing=0 Biểu đồ sử dụng từ ‘python trên & nbsp;

Nó được cung cấp năng lượng từ bộ dữ liệu Google N-gram của Google, một bản ghi về số lần một từ hoặc chuỗi từ cụ thể đã được Google Books phát hiện trong mỗi năm xuất bản. Mặc dù chưa hoàn thành (nó không bao gồm mỗi cuốn sách từng được xuất bản!), Có hàng triệu cuốn sách trong bộ, bao gồm cả những cuốn sách được xuất bản vào những năm 1500 và cho đến năm 2008. Bộ dữ liệu có thể được tải xuống miễn phí tại đây.

Tôi quyết định xem việc tái tạo biểu đồ trên dễ dàng như thế nào bằng cách sử dụng Python và thư viện tải dữ liệu mới của tôi: Pytubes

Thách thức

Bộ dữ liệu 1 gram mở rộng lên 27 GB trên đĩa, một lượng dữ liệu khá lớn để đọc vào Python. Là một cục, Python có thể xử lý các gigabyte dữ liệu một cách dễ dàng, nhưng một khi dữ liệu đó bị phá hủy và xử lý, mọi thứ sẽ chậm hơn rất nhiều và ít hiệu quả hơn về bộ nhớ.

Tổng cộng, có 1,4 tỷ hàng (1,430,727,243) trải trên 38 tệp nguồn, tổng cộng 24 triệu (24.359.460) từ (và các từ được gắn thẻ POS, xem bên dưới), được tính từ năm 1505 đến 2008.

Khi xử lý 1 tỷ hàng, mọi thứ có thể trở nên chậm chạp, nhanh chóng. Và Python bản địa được tối ưu hóa cho loại xử lý này. May mắn là Numpy thực sự tuyệt vời trong việc xử lý số lượng lớn dữ liệu số. Với một số thủ thuật đơn giản, chúng ta có thể sử dụng Numpy để làm cho phân tích này khả thi.

Xử lý chuỗi trong Python/Numpy rất phức tạp. Chi phí bộ nhớ của các chuỗi trong Python là khá quan trọng, và Numpy chỉ thực sự liên quan đến các chuỗi nếu độ dài của chuỗi được biết và cố định. Trong tình huống này, hầu hết các từ có độ dài khác nhau, vì vậy đó là lý tưởng.

Tải & nbsp; dữ liệu

Tất cả các mã/ví dụ dưới đây đã được chạy trên MacBook Pro 2016 với RAM 8 GB. Các phiên bản phần cứng/đám mây với số lượng RAM khá tốt sẽ hoạt động tốt hơn nhiều8 GB ram. Hardware/cloud instances with decent quantities of ram should perform much better

Các số lượng 1 gram được cung cấp dưới dạng một tập hợp các tệp được phân tách theo tab trông như thế này:

Python 1587 4 2Python 1621 1 1PHONTON 1651 2 2PYTHON 1659 1 1

Trong đó mỗi hàng có các trường sau:

1. Word2. Năm xuất bản3. Tổng số lần từ đã được nhìn thấy4. Tổng số cuốn sách chứa từ

Để tạo biểu đồ được yêu cầu, chúng tôi chỉ thực sự cần biết một số thông tin này, cụ thể là:

1. Từ đó có phải là từ mà chúng tôi quan tâm không? 2. Năm xuất bản3. Tổng số lần từ đã được nhìn thấy

Bằng cách chỉ trích xuất thông tin này, các chi phí xử lý dữ liệu chuỗi có độ dài thay đổi đã được tránh, nhưng chúng tôi vẫn cần so sánh các giá trị chuỗi để xác định các hàng nào về trường mà chúng tôi quan tâm. Đây là nơi pytubes xuất hiện:

Khoảng 170 giây (3 phút) sau đó, One_grams là một mảng numpy với ~ 1,4 tỷ hàng, trông như thế này (tiêu đề được thêm vào cho rõ ràng):

╒═══════════╤════════╤═════════╕│ is_word │ năm │ đếm │╞══════════ ═╪════════╪═════════╡│ 0 │ 1799 │ 2 │├─hn ───ệ ─ ─┤│ 0 │ 1804 │ 1 │├ok 0 │ 1805 1 1 │├───ệ ─ ─ ─ ─ ’und │├ồ tạp 1 │ │ ───ệ ớihna ookok───hnes ═══════╧═════════╛

Từ đây, nó chỉ là một câu hỏi về việc sử dụng các phương pháp numpy để tính toán một số điều:

Tổng số từ cho mỗi & nbsp; năm

Google cho thấy % sự xuất hiện của mỗi từ (số lần một từ xảy ra/tổng ​​số từ được xuất bản trong năm đó) có phần hữu ích hơn mà chỉ là số từ thô. Để tính toán điều này, chúng ta cần biết tổng số từ là gì.

May mắn là Numpy làm cho điều này thực sự đơn giản:

Vẽ này cho thấy có bao nhiêu từ mà Google đã thu thập được cho mỗi năm:

Điều mà rõ ràng là trước năm 1800, khối lượng dữ liệu giảm nhanh, và do đó có thể làm lệch kết quả và ẩn các mẫu thú vị. Để chống lại điều này, hãy để Lừa chỉ bao gồm dữ liệu sau 1800:

Trả về 1,3 tỷ hàng (chỉ 3,7% từ được ghi lại từ trước 1800)

Python % by & nbsp; năm

Nhận được % số lượng cho Python bây giờ là dễ dàng một cách đáng ngạc nhiên.

Sử dụng thủ thuật đơn giản là tạo ra các mảng 2008 dựa trên năm 2008 có nghĩa là chỉ số cho mỗi năm bằng với số năm, vì vậy việc tìm kiếm mục nhập, năm 1995 chỉ là một câu hỏi về việc nhận được yếu tố 1.995.

Nó thậm chí không đáng để sử dụng các hoạt động numpy cho việc này:

Vẽ đồ thị Word_Counts kết quả:

Hóa ra hình dạng khá giống với phiên bản Google Google:

Các số % thực tế không phù hợp với tất cả và tôi nghĩ điều này là do bộ dữ liệu có thể tải xuống bao gồm các từ được gắn thẻ với nhiều phần khác nhau của bài phát biểu (ví dụ: python_verb). Điều này không được giải thích tốt trong trang Google cho bộ dữ liệu này và đặt ra một số câu hỏi:

  • Làm thế nào để sử dụng Python làm động từ?
  • Các số đếm cho ‘Python, bao gồm các số lượng cho‘ python_verb,? vân vân.

May mắn thay, nó rõ ràng rằng phương pháp mà tôi đã sử dụng tạo ra hình dạng đồ thị đủ tương tự vì Google rằng các xu hướng tương đối không bị ảnh hưởng, vì vậy đối với việc khám phá này, tôi sẽ không cố gắng khắc phục điều đó.

Màn biểu diễn

Google sản xuất biểu đồ của mình trong ~ 1 giây, so với khoảng 8 phút với tập lệnh này, nhưng điều này là hợp lý. Phần phụ trợ cho số lượng từ Google Google sẽ hoạt động từ các chế độ xem chuẩn bị đáng kể của bộ dữ liệu.

Ví dụ, việc tính trước tổng số từ mỗi năm và lưu trữ nó trong một bảng tra cứu duy nhất sẽ tiết kiệm thời gian đáng kể ở đây. Tương tự, việc lưu trữ từ được tính trong một cơ sở dữ liệu/tệp và lập chỉ mục cột đầu tiên sẽ loại bỏ hầu hết các thời gian xử lý.

Tuy nhiên, điều mà cuộc thăm dò này cho thấy là sử dụng các pytubes Numpy và Fledgeling, nó có thể tải, xử lý và trích xuất một số thông tin thống kê tùy ý từ các bộ dữ liệu hàng tỷ Raw trong một thời gian hợp lý, sử dụng phần cứng hàng hóa tiêu chuẩn và python.

Chiến tranh ngôn ngữ

Chỉ để chứng minh khái niệm với một ví dụ phức tạp hơn một chút, tôi quyết định so sánh tỷ lệ đề cập tương đối của ba ngôn ngữ lập trình: Python, Pascal và Perl.Python, Pascal, and Perl.

Dữ liệu nguồn khá ồn ào (nó bao gồm tất cả các từ tiếng Anh được sử dụng, không chỉ là đề cập ngôn ngữ lập trình và, ví dụ, Python cũng có ý nghĩa phi công nghệ!) Để cố gắng điều chỉnh cho điều này, hai điều đã được thực hiện:

  1. Chỉ các hình thức trường hợp tiêu đề của các tên được khớp (Python, không phải Python)
  2. Mỗi ngôn ngữ đề cập đến số lượng đã được thay đổi bởi số lượng % trung bình từ 1800 đến 1960, được đưa ra Pascal như một ngôn ngữ được đề cập lần đầu tiên vào năm 1970, điều này sẽ đưa ra một đường cơ sở hợp lý.

Results:

So với Google (không có bất kỳ điều chỉnh cơ bản nào):

Thời gian chạy: Chỉ hơn 10 phút

Mã số:

Cải tiến pytubes trong tương lai

Hiện tại, Pytubes chỉ có một khái niệm về số nguyên, đó là int 64 bit. Điều này có nghĩa là các mảng numpy được tạo ra bởi pytubes sử dụng i8 dtypes cho tất cả các số nguyên. Trong một số trường hợp (như dữ liệu ngrams) Các số nguyên 8 byte là một chút quá mức và bộ nhớ thải (Full ndarray ở đây là khoảng 38GB, điều này có thể dễ dàng giảm 60% với DTYPE tốt hơn). Tôi có kế hoạch thêm một số cấp độ hỗ trợ số nguyên 1, 2 và 4 byte sớm (https://github.com/stestagg/pytubes/issues/9)

Nhiều logic lọc hơn - phương thức ống.skip_unless () là một cách đơn giản để lọc các hàng, nhưng thiếu bất kỳ khả năng kết hợp các điều kiện (và/hoặc/không). Điều này sẽ làm cho việc giảm khối lượng dữ liệu được tải nhanh hơn nhiều đối với một số trường hợp sử dụng.

Các bài kiểm tra khớp chuỗi tốt hơn như: startswith, endswith, chứa và is_one_of rất dễ thêm và cải thiện đáng kể tính hữu dụng khi tải nhiều dữ liệu chuỗi.

Như mọi khi, các bản vá được chào đón nhiều hơn!

ĐANG TẢI. . . Nhận xét và nhiều hơn nữa!
. . . comments & more!

Python có thể xử lý hàng triệu hồ sơ?

Câu trả lời là có.Bạn có thể xử lý các bộ dữ liệu lớn trong Python bằng cách sử dụng gấu trúc với một số kỹ thuật.You can handle large datasets in python using Pandas with some techniques.

Bao nhiêu dữ liệu có thể xử lý Python?

Bộ dữ liệu 1 gram mở rộng lên 27 GB trên đĩa, một lượng dữ liệu khá lớn để đọc vào Python.Là một cục, Python có thể xử lý các gigabyte dữ liệu một cách dễ dàng, nhưng một khi dữ liệu đó bị phá hủy và xử lý, mọi thứ sẽ chậm hơn rất nhiều và ít hiệu quả hơn về bộ nhớ.Python can handle gigabytes of data easily, but once that data is destructured and processed, things get a lot slower and less memory efficient.

Làm thế nào để Python xử lý dữ liệu lớn?

3 cách để đối phó với các bộ dữ liệu lớn trong Python.Là một nhà khoa học dữ liệu, tôi thấy mình ngày càng phải đối phó với dữ liệu lớn.....
Giảm sử dụng bộ nhớ bằng cách tối ưu hóa các loại dữ liệu.....
Chia dữ liệu thành các khối.....
Tận dụng đánh giá lười biếng ..

Pandas có thể xử lý dữ liệu lớn không?

Pandas sử dụng tính toán trong bộ nhớ làm cho nó lý tưởng cho các bộ dữ liệu vừa và nhỏ.Tuy nhiên, khả năng xử lý các bộ dữ liệu lớn bị hạn chế do các lỗi ngoài bộ nhớ.Pandas ability to process big datasets is limited due to out-of-memory errors.