2009-09-27 18 views

Trả lời

12

ETS không phải là rác thu thập được vì nó được lưu trữ trong một đống bên ngoài quy trình xóa. Điều này có nghĩa là khi bạn đặt một cái gì đó vào ets nó được sao chép vào nó, và khi bạn lấy nó ra, bạn sẽ có được một bản sao trong quá trình của bạn. Việc thực hiện rất nhiều tra cứu của ets sau đó có thể dẫn đến việc tiêu thụ quá mức trong quá trình của bạn (nhưng điều này chỉ liên quan đến các sản phẩm rất cao).

Từ điển quy trình là rác được thu thập. Nó được lưu trữ trong đống của quá trình. Vì vậy, khi bạn tìm kiếm mọi thứ trong đó bạn sẽ có được một tham chiếu đến cùng một giá trị bạn đặt vào nó. Các giá trị được lưu trữ trong từ điển quy trình không được nén chặt.

Cả hai cách tiếp cận đều không thuần túy, tức là chúng có tác dụng phụ. Có nó là xấu, và có nó không phải là lý do tại sao chúng tôi có cả hai lựa chọn thay thế.

+1

Hầu như tất cả sách Erlang nói rằng chúng ta nên tránh xa thư viện quy trình nhưng tôi nghĩ việc sử dụng sách không khác nhiều. –

+14

"Hầu như tất cả sách Erlang" ... điều đó có nghĩa là hai trong số ba cuốn sách? =) – Zed

9

Lợi ích của ETS trên từ điển quá trình là:

  • quá trình khác có thể truy cập vào bảng ETS trực tiếp
  • ETS cung cấp cho bạn tìm kiếm/cơ sở vật chất phù hợp/lặp, trong khi từ điển quá trình chỉ là một cửa hàng trọng điểm có giá trị .
  • Bạn có thể lưu/tải bảng vào tệp trong một bước
  • Nếu quá trình chủ sở hữu của bạn chết bảng có thể được kế thừa bởi người khác, vì vậy dữ liệu sẽ không bị mất.
9

ETS nhiều hoặc ít hoạt động như thể bảng đang ở trong một quá trình riêng biệt và yêu cầu là các thư được gửi đến quy trình đó. Trong khi nó không được thực hiện với các quá trình mà các thuộc tính của ETS được mô hình hóa như thế. Trên thực tế, có thể thực hiện ETS với các quy trình.

Điều này có nghĩa là các thuộc tính tác dụng phụ phù hợp với phần còn lại của Erlang.

Từ điển quy trình giống như không có gì khác trong Erlang và việc thêm vào đó là một sai lầm lớn. Không có lý do gì để sử dụng từ điển quá trình thay vì một trong những từ điển quá trình cục bộ như dict hoặc gb_trees.

+2

Tôi đoán sự khác biệt giữa ETS và "ETS dựa trên quy trình" sẽ là trước đây có thể được truy cập đồng thời khi sử dụng khóa tốt, trong khi sau này sẽ luôn thực thi đồng bộ hóa (serialization a.k.a.). – Zed

+1

Không thực sự từ một quá trình như truy cập ETS là đồng bộ vì vậy quá trình "gọi" phải đợi cho đến khi nó nhận được một "trả lời" từ ETS. Sự khác biệt là từ điển quy trình sẽ luôn là từ điển trong ngữ cảnh của quá trình đó trong khi ETS sẽ là một truy cập đồng bộ vào dữ liệu được chia sẻ. – rvirding

+1

Tôi thấy rvirding đã bình luận, và anh ấy là một trong những bậc thầy của Erlang, nhưng vào thời điểm này tôi khiêm tốn khác nhau. Tôi thấy cần phải có (và đã sử dụng) từ điển quy trình cho các chức năng vệ sinh trong một quy trình. Đôi khi chúng ta cần lưu trữ trạng thái trong một tiến trình cho một hàm không phải là một phần của chức năng chính của quy trình, ví dụ một trình ghi nhật ký có thể duy trì trạng thái và đặt trạng thái logger vào logic ứng dụng chính là xấu. –

2

Không nghi ngờ gì rằng ETS có nhiều chức năng hơn và tinh vi hơn. Nhưng ...

  • Như điển quá trình hoạt động cập nhật/tra cứu bạn chỉ cần chuyển tài liệu tham khảo, không phải toàn bộ dữ liệu (xem câu trả lời chính xác bởi Christian), nó có thể được nhanh hơn nhiều, đặc biệt là cho các cấu trúc dữ liệu lớn. Khi tôi tái cấu trúc một phần mã để giữ cấu trúc dữ liệu lớn và thường xuyên truy cập trong proc. dict thay vì ETS và chúng tôi đã tăng tốc 30% trong phần đó của mã.

  • Trong nhiều trường hợp, dữ liệu chỉ được truy cập bởi một quy trình. Trong trường hợp đó tôi không thấy sự khác biệt lớn về mặt lý thuyết giữa proc.dict và ETS. Cả hai đều phục vụ cho việc giữ các hiệu ứng phụ trong bộ nhớ. Ngoài ra, bạn có thể truy cập vào proc.dict của một quy trình khác như

    process_info (whereis (net_kernel), dictionary).

Các vấn đề liên quan