Tôi đang truy cập vào một khung dữ liệu Pandas rất lớn dưới dạng biến toàn cục. Biến này được truy cập song song qua joblib.Large Pandas Dataframe xử lý song song
Ví dụ:
df = db.query("select id, a_lot_of_data from table")
def process(id):
temp_df = df.loc[id]
temp_df.apply(another_function)
Parallel(n_jobs=8)(delayed(process)(id) for id in df['id'].to_list())
Truy cập df gốc theo cách này có vẻ như sao chép dữ liệu qua các quy trình. Điều này là bất ngờ vì df gốc không bị thay đổi trong bất kỳ quy trình con nào? (hoặc là nó?)
Tôi đã giả định từ http://stackoverflow.com/questions/10721915/shared-memory-objects-in-python-multiprocessing rằng các quy trình con sẽ không nhận được bản sao đầy đủ trừ khi đối tượng gốc bị thay đổi. Joblib có bị ngắt với ngữ nghĩa copy-on-write không? – autodidacticon
Chỉ một số ít loại có thể được truyền qua bộ nhớ dùng chung. Các đối tượng gấu trúc không có trong danh sách này. joblib tự động xử lý việc chia sẻ bộ nhớ cho các mảng numpy tùy thuộc vào kích thước của mảng bằng cách sử dụng đối số từ khóa 'max_nbytes' khi gọi' Parallel'. Xem [trang web của joblib] (https://github.com/joblib/joblib/blob/master/doc/parallel_numpy.rst). Cũng thấy [câu trả lời này] (http://stackoverflow.com/a/22487898/2551705). Bạn có thể sử dụng các mảng NumPy thay cho Pandas và bạn có thể thấy tăng tốc. –