Giới hạn kích thước dữ liệu Python

trang web. py sử dụng mô-đun cgi để phân tích đầu vào của người dùng và mô-đun cgi có một điều khoản để giới hạn kích thước đầu vào tối đa

Đoạn mã sau giới hạn kích thước của dữ liệu đầu vào là 10MB

import cgi

# Maximum input we will accept when REQUEST_METHOD is POST
# 0 ==> unlimited input
cgi.maxlen = 10 * 1024 * 1024 # 10MB

Xin lưu ý rằng điều này giới hạn kích thước của dữ liệu POST, không phải tệp được tải lên. Tuy nhiên, chúng sẽ gần như giống nhau nếu không có đầu vào nào khác

Mô-đun cgi tăng ValueError khi kích thước đầu vào lớn hơn cgi.maxlen. Nó có thể bị bắt để hiển thị thông báo lỗi bắt buộc

PR này đề xuất giới hạn mềm là một triệu [1 000 000] và giới hạn cứng lớn hơn cho các khía cạnh khác nhau của mã Python và cách triển khai mã

Ngôn ngữ Python không chỉ định giới hạn cho nhiều tính năng của nó. Việc không có bất kỳ giới hạn nào đối với các giá trị này dường như giúp tăng cường sự tự do của lập trình viên, ít nhất là về mặt bề ngoài, nhưng trên thực tế, máy ảo CPython và các máy ảo Python khác có các giới hạn ngầm định hoặc buộc phải giả định rằng các giới hạn đó là quá lớn, điều này rất tốn kém

PR này liệt kê một số tính năng có giới hạn một triệu

Đối với CPython, giới hạn cứng sẽ là tám triệu [8 000 000]

Động lực

Có nhiều giá trị cần được biểu diễn trong máy ảo. Nếu không có giới hạn nào được chỉ định cho các giá trị này, thì biểu diễn phải không hiệu quả hoặc dễ bị tràn. Máy ảo CPython đại diện cho các giá trị như số dòng, độ lệch ngăn xếp và độ lệch lệnh theo giá trị 32 bit. Điều này không hiệu quả và có khả năng không an toàn

Nó không hiệu quả vì các giá trị thực tế hiếm khi cần nhiều hơn một chục bit để biểu thị chúng

Nó không an toàn vì mã độc hại hoặc được tạo kém có thể khiến các giá trị vượt quá 232

Ví dụ: số dòng được biểu thị bằng giá trị 32 bit bên trong. Điều này không hiệu quả vì các mô-đun hầu như không bao giờ vượt quá vài nghìn dòng. Mặc dù không hiệu quả nhưng nó vẫn dễ bị tràn vì kẻ tấn công dễ dàng tạo một mô-đun với hàng tỷ ký tự dòng mới

Truy cập bộ nhớ thường là một yếu tố hạn chế trong hiệu suất của các CPU hiện đại. Việc đóng gói cấu trúc dữ liệu tốt hơn giúp tăng cường tính cục bộ và giảm băng thông bộ nhớ, với mức tăng vừa phải trong mức sử dụng ALU [để dịch chuyển và tạo mặt nạ]. Khả năng lưu trữ an toàn các giá trị quan trọng trong 20 bit sẽ cho phép tiết kiệm bộ nhớ trong một số cấu trúc dữ liệu bao gồm, nhưng không giới hạn ở

  • Đối tượng khung
  • Tiêu đề đối tượng
  • đối tượng mã

Ngoài ra còn có tiềm năng cho một định dạng hướng dẫn hiệu quả hơn, tăng tốc độ gửi thông dịch viên

Đây có phải là một sự đánh đổi đáng giá?

Nhược điểm của bất kỳ hình thức giới hạn nào là nó có khả năng khiến công việc của ai đó trở nên khó khăn hơn, ví dụ, có thể khó viết một trình tạo mã giữ kích thước của các mô-đun ở mức một triệu dòng. Tuy nhiên, ý kiến ​​của tác giả, đã viết nhiều trình tạo mã, rằng giới hạn như vậy rất khó có thể là một vấn đề trong thực tế

Mặt trái của các giới hạn này là sự tự do mà nó cấp cho người triển khai thời gian chạy, cho dù là CPython, PyPy hay bất kỳ triển khai nào khác, để cải thiện hiệu suất. Đó là niềm tin của tác giả, rằng giá trị tiềm năng của thậm chí 0. Giảm 1% chi phí chạy các chương trình Python trên toàn cầu sẽ vượt xa chi phí sửa đổi một số trình tạo mã

cơ sở lý luận

Áp đặt giới hạn cho các giá trị như dòng mã trong mô-đun và số lượng biến cục bộ, có lợi thế đáng kể để dễ triển khai và hiệu quả của máy ảo. Nếu giới hạn đủ lớn, sẽ không có tác động xấu đến người dùng ngôn ngữ

Bằng cách chọn một giới hạn cố định nhưng lớn cho các giá trị này, có thể đạt được cả sự an toàn và hiệu quả trong khi không gây bất tiện cho người lập trình con người và chỉ xảy ra các sự cố rất hiếm gặp đối với trình tạo mã

Một triệu

Giá trị “một triệu” rất dễ nhớ

Giới hạn một triệu chủ yếu là giới hạn đối với mã do con người tạo ra, không phải kích thước thời gian chạy

Một triệu dòng trong một mô-đun đơn lẻ là sự tập trung mã vô lý;

Máy ảo Java [JVM] [1] chỉ định giới hạn 216-1 [65535] cho nhiều phần tử chương trình tương tự như các phần tử được đề cập ở đây. Giới hạn này cho phép các giá trị giới hạn vừa với 16 bit, đây là cách biểu diễn máy rất hiệu quả. Tuy nhiên, giới hạn này khá dễ bị vượt quá trong thực tế bởi các trình tạo mã và tác giả biết mã Python hiện tại đã vượt quá 216 dòng mã

Giới hạn cứng tám triệu phù hợp với 23 bit, mặc dù không thuận tiện cho việc biểu diễn máy nhưng vẫn nhỏ gọn hợp lý. Giới hạn tám triệu là đủ nhỏ để mang lại lợi ích về hiệu quả [chỉ 23 bit], nhưng đủ lớn để không ảnh hưởng đến người dùng [chưa ai từng viết một mô-đun lớn như vậy]

Mặc dù mã được tạo có thể vượt quá giới hạn, nhưng người tạo mã có thể dễ dàng sửa đổi đầu ra của nó để phù hợp với. Tác giả đã đạt đến giới hạn 64K trong JVM ít nhất hai lần khi tạo mã Java. Các cách giải quyết tương đối đơn giản và sẽ không cần thiết với giới hạn một triệu mã byte hoặc dòng mã

Khi cần thiết, giới hạn mềm có thể tăng lên đối với những chương trình vượt quá giới hạn một triệu

Có giới hạn mềm là một triệu đưa ra cảnh báo về mã có vấn đề mà không gây ra lỗi và buộc phải sửa ngay lập tức. Nó cũng cho phép các trình tối ưu hóa động sử dụng các định dạng nhỏ gọn hơn mà không cần kiểm tra nội tuyến

Sự chỉ rõ

PR này đề xuất rằng các tính năng ngôn ngữ và giá trị thời gian chạy sau đây có giới hạn mềm là một triệu

  • Số lượng dòng mã nguồn trong một mô-đun
  • Số lượng hướng dẫn mã byte trong một đối tượng mã
  • Tổng các biến cục bộ và mức sử dụng ngăn xếp cho một đối tượng mã
  • Số lớp trong trình thông dịch đang chạy
  • Độ sâu đệ quy của mã Python

Có khả năng các hạn chế về bộ nhớ sẽ là một yếu tố hạn chế trước khi số lớp đạt đến một triệu

Độ sâu đệ quy

Giới hạn độ sâu đệ quy chỉ áp dụng cho mã Python thuần túy. Mã được viết bằng tiếng nước ngoài, chẳng hạn như C, có thể sử dụng ngăn xếp phần cứng và do đó bị giới hạn ở độ sâu đệ quy là vài nghìn. Dự kiến ​​việc triển khai sẽ phát sinh ngoại lệ nếu ngăn xếp phần cứng gần đạt đến giới hạn của nó. Đối với mã kết hợp lệnh gọi Python và C, rất có thể giới hạn phần cứng sẽ được áp dụng trước. Kích thước của đệ quy phần cứng có thể thay đổi trong thời gian chạy và sẽ không hiển thị

Giới hạn mềm và cứng

Việc triển khai sẽ phát ra cảnh báo bất cứ khi nào vượt quá giới hạn mềm, trừ khi giới hạn cứng có cùng giá trị với giới hạn mềm. Khi vượt quá giới hạn cứng, thì một ngoại lệ sẽ được đưa ra

Tùy thuộc vào việc triển khai, các giới hạn cứng khác nhau có thể áp dụng. Trong một số trường hợp, giới hạn cứng có thể thấp hơn giới hạn mềm. Ví dụ: nhiều cổng micropython không có khả năng hỗ trợ các giới hạn lớn như vậy

Xem xét nội tâm và sửa đổi các giới hạn

Một hoặc nhiều chức năng sẽ được cung cấp trong mô-đun sys để xem xét nội tâm hoặc sửa đổi các giới hạn mềm trong thời gian chạy, nhưng các giới hạn này có thể không được nâng lên trên giới hạn cứng

giới hạn suy luận

Các giới hạn này không phải là một phần của thông số kỹ thuật, nhưng giới hạn dưới một triệu có thể được suy ra từ giới hạn về số lượng hướng dẫn mã byte trong một đối tượng mã. Bởi vì sẽ không có đủ hướng dẫn để tải hơn một triệu hằng số hoặc sử dụng hơn một triệu tên

  • Số lượng tên riêng biệt trong một đối tượng mã
  • Số lượng hằng số trong một đối tượng mã

Những lợi thế cho CPython khi áp đặt các giới hạn này

Dòng mã trong một mô-đun và hạn chế đối tượng mã

Khi biên dịch mã nguồn thành mã byte hoặc sửa đổi mã byte để lập cấu hình hoặc gỡ lỗi, cần có biểu mẫu trung gian. Bằng cách giới hạn các toán hạng ở 23 bit, các lệnh có thể được biểu diễn ở dạng 64 bit nhỏ gọn cho phép chuyển rất nhanh qua chuỗi lệnh

Có các toán hạng 23 bit [24 bit cho các nhánh tương đối] cho phép các lệnh phù hợp với 32 bit mà không cần các lệnh EXTENDED_ARG bổ sung. Điều này cải thiện công văn, vì toán hạng hoàn toàn cục bộ đối với lệnh. Không rõ liệu điều này có giúp ích cho hiệu suất hay không, nó chỉ là một ví dụ về những gì có thể

Lợi ích của việc hạn chế số lượng dòng trong mô-đun chủ yếu là giới hạn ngụ ý đối với mã byte. Điều quan trọng hơn đối với việc triển khai là hướng dẫn cho mỗi đối tượng mã, không phải dòng cho mỗi mô-đun, được giới hạn ở một triệu, nhưng việc giải thích giới hạn một triệu dòng sẽ dễ dàng hơn nhiều. Có giới hạn nhất quán là một triệu chỉ dễ nhớ hơn. Rất có thể, mặc dù không được đảm bảo, rằng giới hạn dòng sẽ bị tấn công trước và do đó cung cấp thông báo lỗi dễ hiểu hơn cho nhà phát triển

Tổng số lớp trong một trình thông dịch đang chạy

Giới hạn này có khả năng giảm đáng kể kích thước của các tiêu đề đối tượng

Hiện tại các đối tượng có tiêu đề hai từ, đối với các đối tượng không có tham chiếu [int, float, str, v.v. ] hoặc tiêu đề bốn từ cho các đối tượng có tham chiếu. Bằng cách giảm số lượng lớp tối đa, không gian cho tham chiếu lớp có thể giảm từ 64 bit xuống dưới 32 bit cho phép tiêu đề nhỏ gọn hơn nhiều

Ví dụ: định dạng tiêu đề siêu nhỏ gọn có thể trông như thế này

struct header {
    uint32_t gc_flags:6; /* Needs finalisation, might be part of a cycle, etc. */
    uint32_t class_id:26; /* Can be efficiently mapped to address by ensuring suitable alignment of classes */
    uint32_t refcount; /* Limited memory or saturating */
}

Định dạng này sẽ giảm kích thước của đối tượng Python không có khe cắm, trên máy 64 bit, từ 40 xuống 16 byte

Lưu ý rằng có hai cách để sử dụng số đếm lại 32 bit trên máy 64 bit. Một là giới hạn mỗi trình thông dịch phụ trong bộ nhớ 32Gb. Cách khác là sử dụng số lượng tham chiếu bão hòa, sẽ chậm hơn một chút nhưng cho phép phân bổ bộ nhớ không giới hạn

Thực thi

Việc triển khai Python không bắt buộc phải thực thi các giới hạn. Tuy nhiên, nếu một giới hạn có thể được thi hành mà không ảnh hưởng đến hiệu suất, thì nó nên

Dự đoán rằng CPython sẽ thực thi các giới hạn như sau

  • Số lượng dòng mã nguồn trong một mô-đun. phiên bản 3. 9 trở đi
  • Số lượng hướng dẫn mã byte trong một đối tượng mã. 3. 9 trở đi
  • Tổng các biến cục bộ và mức sử dụng ngăn xếp cho một đối tượng mã. 3. 9 trở đi
  • Số lớp trong trình thông dịch đang chạy. có lẽ là 3. 10 trở đi, có thể cảnh báo trong 3. 9

Giới hạn cứng trong CPython

CPython sẽ thực thi giới hạn cứng đối với tất cả các giá trị trên. Giá trị của hard limit sẽ là 8 triệu

Theo giả thuyết, có thể một số mã do máy tạo ra vượt quá một hoặc nhiều giới hạn trên. Tác giả tin rằng điều đó khó xảy ra và dễ dàng khắc phục bằng cách sửa đổi giai đoạn đầu ra của trình tạo mã

Chúng tôi muốn đạt được lợi ích từ các giới hạn hiệu suất trên càng sớm càng tốt. Vì vậy, CPython sẽ bắt đầu áp dụng các giới hạn từ phiên bản 3. 9 trở đi. Để dễ dàng chuyển đổi và giảm thiểu sự cố, giới hạn ban đầu sẽ là 16 triệu, giảm xuống còn 8 triệu trong phiên bản sau

Khả năng tương thích ngược

Các giới hạn cứng thực tế được thi hành bởi CPython sẽ là

Phiên bản Giới hạn cứng3. 916 triệu3. 10 trở đi8 triệu

Với sự hiếm có của các trình tạo mã vượt quá giới hạn một triệu và môi trường mà chúng thường được sử dụng, có vẻ hợp lý để bắt đầu đưa ra các cảnh báo trong 3. 9 nếu bất kỳ số lượng hạn chế nào vượt quá một triệu

Trong lịch sử, giới hạn đệ quy đã được đặt ở 1000. Để tránh vi phạm mã hoàn toàn dựa vào giá trị nhỏ, giới hạn đệ quy mềm sẽ được tăng dần, như sau

Phiên bảnGiới hạn mềm3. 94 0003. 1016 0003. 1164 0003. 12125 0003. 131 triệu

Giới hạn cứng sẽ được đặt thành 8 triệu ngay lập tức

triển khai khác

Việc triển khai Python ngoài CPython có các mục đích khác nhau, do đó, các giới hạn khác nhau có thể phù hợp. Điều này có thể chấp nhận được, miễn là các giới hạn được ghi lại rõ ràng

Triển khai mục đích chung

Việc triển khai cho mục đích chung, chẳng hạn như PyPy, nên sử dụng giới hạn một triệu. Nếu mục tiêu là tương thích tối đa, thì họ cũng nên tuân theo hành vi của CPython trong 3. 9 đến 3. 11

Triển khai mục đích đặc biệt

Việc triển khai cho mục đích đặc biệt có thể sử dụng các giới hạn thấp hơn, miễn là chúng được ghi lại rõ ràng. Việc triển khai được thiết kế cho các hệ thống nhúng, chẳng hạn như MicroPython, có thể áp đặt các giới hạn thấp tới vài nghìn

Ý nghĩa bảo mật

Tối thiểu. Điều này làm giảm một lượng nhỏ bề mặt tấn công của bất kỳ máy ảo Python nào

Thực hiện tham khảo

Chưa có. Điều này sẽ được triển khai trong CPython, sau khi PEP đã được chấp nhận

Ý tưởng bị từ chối

Có thể sửa đổi các giới hạn cứng trở lên tại thời điểm biên dịch được đề xuất bởi Tal Einat. Điều này bị từ chối vì giới hạn hiện tại là 232 không phải là vấn đề và lợi ích thực tế của việc cho phép giới hạn từ 220 đến 232 có vẻ nhỏ so với độ phức tạp của mã bổ sung khi hỗ trợ tính năng như vậy

vấn đề mở

Chưa có

Người giới thiệu

[1]Đặc tả máy ảo Java

https. // tài liệu. tiên tri. com/javase/specs/jvms/se8/jvms8. pdf

bản quyền

Tài liệu này được đặt trong phạm vi công cộng hoặc theo CC0-1. 0-Giấy phép phổ thông, tùy theo điều kiện nào dễ dãi hơn

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

Chúng tôi đã sử dụng nó thường xuyên với Python. Đó là một công cụ tuyệt vời khi tập dữ liệu nhỏ, chẳng hạn như dưới 2–3 GB. Nhưng khi kích thước của tập dữ liệu tăng vượt quá 2–3 GB, bạn không nên sử dụng Pandas. Pandas tải toàn bộ dữ liệu vào bộ nhớ trước khi thực hiện bất kỳ xử lý nào trên khung dữ liệu

Pandas có thể xử lý hàng triệu hàng không?

Thông thường, Pandas tìm thấy điểm thích hợp khi sử dụng trong các tập dữ liệu có kích thước từ thấp đến trung bình lên đến vài triệu hàng . Ngoài ra, các khung phân tán hơn như Spark hoặc Dask thường được ưu tiên hơn. Tuy nhiên, có thể mở rộng quy mô gấu trúc vượt quá điểm này.

Pandas có thể được sử dụng cho dữ liệu lớn không?

pandas cung cấp cấu trúc dữ liệu cho phân tích trong bộ nhớ, điều này làm cho việc sử dụng pandas để phân tích tập dữ liệu lớn hơn tập dữ liệu bộ nhớ hơi khó . Ngay cả các bộ dữ liệu chiếm một phần lớn bộ nhớ cũng trở nên khó sử dụng, vì một số hoạt động của gấu trúc cần tạo các bản sao trung gian.

Có giới hạn về số lượng hàng trong Pandas không?

giới hạn mặc định là 99.999 nên chỉ có nhiều hàng này được kéo. Chúng tôi cũng có thể đặt all_rows=True. all_rows chỉ định liệu tất cả các hàng từ Khung dữ liệu teradataml có được truy xuất hay không trong khi tạo Khung dữ liệu gấu trúc.

Chủ Đề