Làm cách nào để đọc nhiều đối tượng json trong python?

Nếu bạn đã đọc bài đăng trên blog đầu tiên, thì bạn đã học được một số mẹo và thủ thuật về cách xử lý một tệp JSON lớn trong Python. Trong phần này, tôi muốn tập trung vào cách làm việc hiệu quả với nhiều tệp JSON

Như đã đề xuất, tốt hơn là đọc tệp JSON qua Pandas, sử dụng phương thức read_json[] và chuyển tham số chunksize, để chỉ tải và thao tác một số lượng hàng nhất định tại một thời điểm. Phương thức sẽ không trả về khung Dữ liệu mà là đối tượng JsonReader để lặp lại. Để truy cập nội dung tệp và tạo khung dữ liệu Pandas, bạn có thể sử dụng

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

interactions_data_frames = []
for interactions_input_file in json_files:
    interactions_temp = pd.concat[pd.read_json[interactions_input_folder+'/'+interactions_input_file,
orient='records', lines=True, chunksize=chunk_value]]
    interactions_data_frames.append[interactions_temp]

interactions = pd.concat[interactions_data_frames, ignore_index=True, sort=True]

2] Đối với vòng lặp

interactions_data_frames = []
for interactions_input_file in json_files:
    interactions_temp = pd.read_json[interactions_input_folder + '/' + interactions_input_file, 
orient='records', lines=True, chunksize=chunk_value] for chunk in interactions_temp: interactions_data_frames.append[chunk] interactions = pd.concat[interactions_data_frames, ignore_index=True, sort=True]

GIẢI THÍCH MÃ

    • Trong cả hai trường hợp, chúng tôi đã tạo một danh sách trống có tên là Interactive_data_frames
    • Trong cả hai trường hợp, chúng tôi đã lặp lại json_files , danh sách chứa tất cả các tệp JSON
    • Trong ví dụ 1] interactions_temp là Khung dữ liệu Pandas. Việc ghép nối sẽ chỉ diễn ra khi toàn bộ tệp đã được đọc. Sau đó, chúng tôi nối tất cả các khung dữ liệu [một khung cho mỗi tệp] vào danh sách trống
    • Trong ví dụ 2] interactions_temp là một đối tượng JsonReader;
    • Trong cả hai trường hợp, chúng tôi đã tạo khung dữ liệu duy nhất [ tương tác ] bằng cách nối các đối tượng khung dữ liệu trong interactions_data_frames


Chúng tôi đã kiểm tra cả hai phương pháp bằng cách sử dụng cùng một dữ liệu và thấy rằng vòng lặp For có vẻ tốt hơn vòng lặp Concat về mặt thời gian [139. 496203 giây thay vì 146. 306893] nhưng không phải về mặt bộ nhớ, như bạn có thể thấy từ kết quả của thử nghiệm này

Bạn cũng có thể chơi với giá trị của tham số chunksize cho đến khi đạt được sự cân bằng tốt; . Cụ thể, chúng tôi nhận thấy rằng khối càng lớn thì phân tích cú pháp càng nhanh và mức sử dụng bộ nhớ càng cao. Sau đó, bạn có thể thử thử nghiệm và đạt được mức sử dụng bộ nhớ và thời gian phân tích có thể chấp nhận được. Trong trường hợp của chúng tôi với giá trị chunksize là 10000, chúng tôi đã đạt được một thỏa hiệp tốt

Tại đây bạn có thể tìm thấy một số cuộc thảo luận cộng đồng về chủ đề này [2], [3]

Nhiều tệp nhỏ so với vài tệp lớn

Khi làm việc với JSON, sẽ tốt hơn nếu có nhiều tệp nhỏ hay ít tệp lớn?

Để giải thích điều tôi muốn nói, hãy tưởng tượng có thương mại điện tử

Chúng tôi thu thập tất cả các tương tác mà người dùng có với các sản phẩm của trang web và lưu chúng vào nhật ký JSON. Sau đó, chúng tôi phải đọc tất cả các tệp này bằng Python, thao tác với chúng và tạo các bộ đào tạo và kiểm tra để đào tạo mô hình Học để xếp hạng.  

Chúng tôi định cấu hình hệ thống để cuộn các tệp nhật ký dựa trên ngày/giờ và chúng tôi đưa ra giả thuyết về hai trường hợp khác nhau

1] Cuộn các tệp nhật ký mỗi ngày một lần

Ví dụ: mỗi ngày chúng tôi nhận được một nhật ký [khoảng 2GB]. tương tác người dùng-2021-06-20. đăng nhập

2] Cuộn các tệp nhật ký cứ sau 15 phút

Mỗi ngày chúng tôi nhận được 96 nhật ký [khoảng 20 MB mỗi nhật ký], chẳng hạn.
tương tác người dùng-2021-06-20-00-00. nhật ký
tương tác người dùng-2021-06-20-00-15. log
user-interactions-2021-06-20-00-30. nhật ký

tương tác người dùng-2021-06-20-23-45. nhật ký

Chúng tôi sẽ có khoảng 2GB dữ liệu trong cả hai trường hợp, nhưng chúng tôi băn khoăn liệu sẽ tốt hơn nếu quản lý một tệp lớn hay nhiều tệp nhỏ xét về thời gian và mức sử dụng bộ nhớ

Chúng tôi đã thử nghiệm quy trình sử dụng cả hai phương pháp trên dữ liệu tương tác của người dùng trong nửa tháng để mô phỏng một ứng dụng trong thế giới thực

Dưới đây là sự khác biệt giữa phân tích cú pháp nhiều tệp nhỏ và một vài tệp lớn

Phân tích tệp json 27 GB mất khoảng 40 phút và mức sử dụng bộ nhớ khung dữ liệu là khoảng 60 GB

    • Sử dụng nhiều tệp nhỏ, chúng tôi có lợi thế về THỜI GIAN khi tải nhật ký. ít hơn khoảng 3 phút
    • Sử dụng ít tệp lớn, chúng tôi có lợi thế về BỘ NHỚ. ít hơn 4GB

Khung dữ liệu hàm Pandas. info[] [4] được sử dụng để in thông tin tóm tắt về khung dữ liệu. Nó bao gồm tên cột, số lượng không null và dtype. Tham số memory_usage chỉ định xem có nên hiển thị tổng mức sử dụng bộ nhớ của các thành phần khung dữ liệu [bao gồm cả chỉ mục] hay không. Giá trị 'deep' sẽ thực hiện tính toán mức sử dụng bộ nhớ thực

dataframe.info[memory_usage='deep']

ĐẦU RA


RangeIndex: 28242019 entries, 0 to 28242018
Data columns [total 77 columns]:
Feature1              63580000 non-null object
Feature2              62740023 non-null uint8
Feature3              63587849 non-null float64
.......              ......
Feature75             61678009 non-null object
Feature76             63490887 non-null float16
dtypes: datetime64[ns][1], float16[23], float64[6], object[45], uint32[1], uint8[1]
memory usage: 60.2 GB

Để ghi lại hoạt động của CPU và bộ nhớ của toàn bộ quy trình Python, chúng tôi đã sử dụng tiện ích có tên là psrecord [5] cho phép chúng tôi lưu trữ dữ liệu vào một tệp hoặc vẽ nó trong biểu đồ

pip install psrecord

psrecord 11653 --interval 20 --plot plot1.png --log log1.log

ở đâu

    • 11653 là PID [ID của tiến trình cần giám sát]
    • khoảng thời gian. để chỉ định khoảng thời gian mà dữ liệu được thăm dò ý kiến
    • mảnh đất. để chỉ định đường dẫn nơi lưu cốt truyện
    • đăng nhập. để chỉ định đường dẫn nơi lưu nhật ký

Từ các thử nghiệm của mình, chúng tôi nhận thấy rằng khi chúng tôi có một lượng dữ liệu đáng kể và hầu hết các tính năng là phân loại [đối tượng], mức sử dụng RAM sẽ gấp 5 lần so với các tệp gốc [về mức sử dụng dung lượng ổ đĩa gốc]. Trong trường hợp của chúng tôi, kích thước của tệp gốc là 27 GB, mức sử dụng bộ nhớ khung dữ liệu là 60. 2 GB và mức sử dụng bộ nhớ tiến trình là khoảng 129 GB

Quá nhiều đối tượng

Hãy xem điều gì sẽ xảy ra nếu chúng ta loại bỏ tất cả các tính năng của 'đối tượng' khỏi cùng một tập dữ liệu

Trước khi chúng tôi có 77 cột bao gồm 45 loại 'đối tượng' [tất cả đều là mảng]. Xóa chúng, chúng tôi kết thúc với 32 cột với các loại sau

dtypes: datetime64[ns][1], float16[23], float64[6], uint32[1], uint8[1]

Dưới đây là sự khác biệt giữa phân tích cú pháp nhiều tệp nhỏ và một vài tệp lớn

Thời gian và ký ức đã thay đổi mạnh mẽ

Trong trường hợp này, việc phân tích tệp json 25 GB mất khoảng 10 phút và mức sử dụng bộ nhớ khung dữ liệu là khoảng 3 GB. Ngay cả việc sử dụng RAM cũng đã giảm đáng kể

Đây là bằng chứng cho thấy tập dữ liệu của bạn càng chứa nhiều loại nguyên thủy thì việc phân tích dữ liệu sẽ càng ít ảnh hưởng. Số lượng tính năng của 'đối tượng' càng tăng thì khoảng cách giữa chi phí mà các tệp json ban đầu có trên đĩa và bộ nhớ khung dữ liệu sẽ càng tăng

Thực tế là nhiều tệp nhỏ cần ít thời gian hơn nhưng sử dụng nhiều RAM hơn để phân tích cú pháp so với một số tệp lớn vẫn không bị ảnh hưởng

Để đơn giản, trong thử nghiệm này, chúng tôi chỉ bỏ các tính năng 'đối tượng' để cho bạn thấy những lợi thế về thời gian và bộ nhớ. Trong một kịch bản trong thế giới thực, chúng ta phải tìm cách chuyển đổi tất cả các cột 'đối tượng' thành các loại tiết kiệm bộ nhớ hơn

Trong phần “mẹo & thủ thuật” tiếp theo, chúng ta sẽ thảo luận chi tiết cách giải quyết vấn đề này. Giữ nguyên

// dịch vụ của chúng tôi

Cắm không biết xấu hổ cho đào tạo và dịch vụ của chúng tôi

Tôi đã đề cập đến việc chúng tôi thực hiện đào tạo Apache Solr dành cho người mới bắt đầu và Trí tuệ nhân tạo trong Tìm kiếm không?
Chúng tôi cũng cung cấp dịch vụ tư vấn về các chủ đề này, hãy liên hệ nếu bạn muốn đưa công cụ tìm kiếm của mình đến với .

// LUÔN LUÔN CẬP NHẬT

Theo dõi bản tin của chúng tôi

Bạn có thích bài đăng này về Cách quản lý JSON lớn một cách hiệu quả và nhanh chóng không?

Tôi đã đọc và đồng ý Chính sách bảo mật

Để trống trường này nếu bạn là người.

Có liên quan

khoa học dữ liệu tính năng kỹ thuật truy xuất thông tin json pandas python

69

Tác giả

Ilaria Petreti

Ilaria là một Nhà khoa học dữ liệu đam mê thế giới Trí tuệ nhân tạo. Cô ấy thích áp dụng các kỹ thuật Khai thác dữ liệu và Học máy, tin tưởng mạnh mẽ vào sức mạnh của Dữ liệu lớn và Chuyển đổi số

Làm cách nào để đọc tất cả các tệp JSON trong Python?

json. tải []. Nếu bạn có một chuỗi JSON, bạn có thể phân tích cú pháp chuỗi đó bằng cách sử dụng hàm json. phương thức loading[] . json. loading[] không lấy đường dẫn tệp, nhưng nội dung tệp dưới dạng chuỗi, sử dụng fileobject. đọc [] với json. loading[] chúng ta có thể trả về nội dung của tệp. Ví dụ. Ví dụ này cho thấy việc đọc từ cả chuỗi và tệp JSON.

Làm cách nào để phân tích mảng đối tượng JSON trong Python?

Để phân tích chuỗi dữ liệu JSON thành đối tượng Python, hãy sử dụng json. loads[] của gói dựng sẵn có tên json . json. phương thức loading[] phân tích cú pháp chuỗi dữ liệu JSON được cung cấp và trả về một từ điển Python chứa tất cả dữ liệu từ JSON.

Làm cách nào để kết hợp nhiều tệp JSON thành một?

Bước 1. Tải các tệp json với sự trợ giúp của pandas dataframe
Bước 2. Nối các khung dữ liệu thành một khung dữ liệu
Bước 3. Chuyển đổi khung dữ liệu được nối thành tệp CSV

JSON có thể chứa nhiều đối tượng không?

Bạn có thể truyền một đối tượng JSON để tạo một phần tử hoặc một mảng JSON gồm các đối tượng JSON nhóm để tạo nhiều phần tử .

Chủ Đề