Nếu các quá trình duy nhất từng đọc dữ liệu, nhưng không sửa đổi nó, sau đó tôi tin rằng bạn có thể đặt dữ liệu đầu vào của bạn vào một tập tin lớn và có mỗi quá trình mở và đọc từ tập tin đó. Mỗi quá trình sẽ có chỉ báo vị trí tệp riêng của nó mà nó có thể di chuyển bất cứ nơi nào trong tệp để đọc dữ liệu cần thiết. Tôi đã thử nghiệm có hai quá trình MATLAB đọc đồng thời từ một tập tin một triệu lần hoặc mỗi lần và mọi thứ dường như hoạt động tốt. Tôi chỉ sử dụng các lệnh I/O tập tin cơ bản (được liệt kê bên dưới). Nó xuất hiện bạn cũng có thể làm điều này bằng cách sử dụng MEMMAPFILE, như Mr Fooz được đề cập trong câu trả lời của mình (và SCFrench trong một bình luận), giả sử bạn có phiên bản MATLAB R2008a hoặc mới hơn.
Dưới đây là một số các tập tin I/O lệnh mà bạn có thể sẽ sử dụng cho việc này:
FOPEN: Mỗi quá trình sẽ gọi fopen và trả về một tập tin định danh nó sẽ sử dụng trong tất cả các cuộc gọi tiếp theo. Bạn có thể mở một tập tin trong cả hai nhị phân hoặc văn bản chế độ:
fid = fopen('data.dat','r'); % Binary mode
fid = fopen('data.txt','rt'); % Text mode
FREAD: Trong chế độ nhị phân, fread sẽ đọc dữ liệu từ file:
A = fread(fid,20,'double'); % Reads 20 double-precision values
FSCANF: Trong văn bản chế độ, FSCANF sẽ đọc và định dạng dữ liệu từ tệp:
A = fscanf(fid,'%d',4); % Reads 4 integer values
FGETL/FGETS: Ở chế độ văn bản, chúng sẽ đọc toàn bộ dòng từ tệp.
FTELL: Điều này sẽ cho bạn biết chỉ báo vị trí tập tin hiện theo byte từ đầu tập tin:
ftell(fid)
ans =
8 % The position indicator is 8 bytes from the file beginning
FSEEK: Điều này sẽ thiết lập các chỉ báo vị trí tập tin vào một vị trí mong muốn trong file:
fseek(fid,0,-1); % Moves the position indicator to the file beginning
FCLOSE: Mỗi quá trình sẽ phải đóng truy cập của nó đến tập tin (rất dễ dàng để quên đi để làm điều này):
fclose(fid);
Giải pháp này có khả năng sẽ yêu cầu các tập tin đầu vào có một định dạng có cấu trúc tốt đó là dễ dàng để đi qua (ví dụ: chỉ một ma trận lớn). Nếu nó có nhiều trường có độ dài thay đổi thì việc đọc dữ liệu từ vị trí chính xác trong tệp có thể rất phức tạp.
Nếu các quá trình phải cũng sửa đổi dữ liệu, điều này có thể nhận được thậm chí khó khăn hơn. Nói chung, bạn không muốn vị trí tệp/bộ nhớ được ghi đồng thời bởi nhiều quy trình hoặc được viết bởi một quy trình trong khi một tệp khác đang đọc từ cùng một vị trí, vì hành vi không mong muốn có thể xảy ra. Trong trường hợp này, bạn sẽ phải hạn chế quyền truy cập vào tệp sao cho chỉ có một tiến trình tại một thời điểm đang hoạt động trên đó. Các quy trình khác sẽ phải đợi cho đến khi quá trình đầu tiên được thực hiện.Một phiên bản mẫu mã mà mỗi tiến trình sẽ phải chạy trong trường hợp này là:
processDone = false;
while ~processDone,
if file_is_free(), % A function to check that other processes are not
% accessing the file
fid = fopen(fileName,'r+'); % Open the file
perform_process(fid); % The computation this process has to do
fclose(fid); % Close the file
processDone = true;
end
end
cơ chế đồng bộ hóa như thế này ("locks") đôi khi có thể có một chi phí cao làm giảm hiệu quả song song tổng thể của mã.
Dữ liệu của tôi chưa lớn nhưng là tĩnh, nghĩa là chức năng không thay đổi nó. Ừ. Đọc một tập tin thực sự có thể làm việc. – AnnaR