Chuyển tới nội dung chính

Memory Match (So khớp bộ nhớ)

Hỏi một ứng viên có khớp thứ gì đã nhớ không, và rẽ theo câu trả lời.

Mục đích

Thử một ứng viên với mọi mục còn sống trong bộ nhớ có tên. Bất kỳ mục nào thỏa điều kiện, node rẽ matched; không thì notMatched.

Điều kiện là biểu thức đầy đủ, nên phép khớp dùng được dung sai, khoảng, và thao tác chuỗi — không chỉ bằng nhau.

Khi nào dùng

  • Chốt chặn cooldown: "xử lý mục tiêu này gần đây chưa?"
  • Khử trùng lặp: "mục này có trong danh sách đã xử lý chưa?"
  • Kiểm lân cận: "có mục đã nhớ nào gần vị trí này không?"

Khi nào không dùng

  • Đọc một khóa đã biết — đó là tra cứu, không phải khớp.
  • So hai biến — dùng If.
  • Trước khi có gì được nhớ — bộ nhớ rỗng và mọi ứng viên rẽ notMatched.

Điều kiện

Một tên bộ nhớ, và một biểu thức điều kiện. Bộ nhớ phải được node Runtime Memory ghi.

Cách nó chạy

Mục hết hạn không được xét — TTL bạn đặt lúc ghi là thứ làm chốt chặn tự dọn.

Thiết lập

Thiết lậpKiểuKhoảngGhi chú
Memorystring1–100 ký tựBắt buộc. Kho cần tìm
Expressionstring≤ 1000 ký tựĐiều kiện, tham chiếu {{item.<trường>}}
Conditionsdanh sách1–50 dòngBuilder không-code cũ
Logiclựa chọnand / orCách các dòng cũ gộp

Tham chiếu mục đang xét

Trong biểu thức, mục được thử lộ ra là item:

{{item.x_coordinate}}
{{item.status}}

Giá trị ứng viên của bạn đến từ biến flow thường.

Khớp dung sai — lý do node này tồn tại

Bằng nhau tuyệt đối gần như vô dụng với dữ liệu màn hình thật. Engine biểu thức cho diễn tả độ gần:

(abs({{current_x}} - {{item.x_coordinate}}) <= 1) && (abs({{current_y}} - {{item.y_coordinate}}) <= 1)

Đọc là: "có mục đã nhớ nào trong vòng một ô quanh chỗ tôi đứng không?"

Đây là thứ làm khuôn mẫu chạy khi OCR đọc tọa độ lệch một pixel, hay vị trí báo của mục tiêu xê dịch nhẹ giữa các khung.

Không có thiết lập scope

Memory Match đọc xuyên các scope — nó không nhận tham số scope. Node cũ có thể mang trường scope; nó được dung thứ và bỏ qua.

Khớp tên bộ nhớ cẩn thận

Vì node này không chọn scope, tên bộ nhớ là thứ nối nó với các lần ghi. Gõ nhầm nghĩa là bộ nhớ rỗng và notMatched vĩnh viễn.

Port

PortĐi vào khiBắt buộc
matchedCó mục sống thỏa điều kiệnKhông — khoan dung
notMatchedKhông mục nào thỏaKhông — khoan dung
FatalCấu hình saiKhông — không bao giờ được đi

Cả hai nhánh tùy chọn. Bỏ trống một nhánh kết thúc đường đó nhẹ nhàng — lựa chọn "dừng ở đây" hợp lệ — nhưng thường bạn muốn cả hai.

Ví dụ cơ bản

Mục này xử lý chưa?

  • Memory: processed_items
  • Expression: {{item.id}} == {{current_id}}

matched → bỏ; notMatched → xử lý.

Ví dụ thực tế — chốt chặn cooldown đầy đủ

Chú ý thứ tự: khớp trước, nhớ sau. Nhớ trước khi khớp thì luôn khớp chính mục của mình.

Chú ý luôn đường Failure của phép đọc — không định danh được mục tiêu, cứ xử lý thường an toàn hơn bỏ việc vĩnh viễn.

Ví dụ nâng cao — bộ lọc trạng thái

Mục mang trường tùy ý, nên phép khớp diễn tả được luật nghiệp vụ:

{{item.account}} == {{current_account}} && {{item.status}} == "pending"

matched nghĩa "tài khoản này đã có việc chờ" — nên đừng xếp thêm.

Best practices

  • Luôn khớp trước khi nhớ. Kẻo ứng viên khớp chính nó.
  • Dùng dung sai, không bằng tuyệt đối, cho mọi thứ dẫn từ màn.
  • Giữ tên trường y hệt giữa lần ghi Runtime Memory và biểu thức này.
  • Nối cả hai port. Khoan dung không có nghĩa nên bỏ ngỏ.
  • Xử lý ca "không định danh được" riêng — ứng viên không đọc được khác ứng viên không khớp.
  • Test với bộ nhớ rỗng trước. Mọi thứ nên rẽ notMatched.

Ghi chú hiệu năng

  • Biểu thức định giá một lần mỗi mục sống. Bộ nhớ 500 mục nghĩa là 500 lần định giá mỗi lời gọi.
  • Giữ bộ nhớ nhỏ bằng TTL thực tế — mục hết hạn không được định giá, nên TTL là van chi phí chính.
  • Đọc persist hay shared dính SQLite; scope run trong RAM.
  • Đặt Memory Match trong vòng siết trên bộ nhớ lớn là cách duy nhất làm node này đắt.

Ghi chú bộ nhớ

  • Node đọc mục; không bao giờ ghi. Nó không phình được bộ nhớ.
  • Mục sống được hiện thực hóa để định giá, nên bộ nhớ rất lớn có chi phí working-set thật lúc khớp.

Lỗi thường gặp

LỗiHậu quảCách sửa
Nhớ trước khi khớpLuôn khớp mục của chính nóKhớp trước
Gõ nhầm tên trườngKhông bao giờ khớpGiữ tên y hệt lần ghi
Gõ nhầm tên bộ nhớBộ nhớ rỗng, notMatched vĩnh viễnKiểm tên
Bằng tuyệt đối trên giá trị OCRTrượt các mục suýt-trùngDung sai với abs()
Cả hai port bỏ trốngĐường kết thúc lặng lẽNối cả hai
Kỳ vọng bộ chọn scopeKhông cóTên bộ nhớ là mối nối

Khắc phục sự cố

Không bao giờ khớp. Ba nguyên nhân thường: tên bộ nhớ lệch lần ghi, tên trường lệch, hoặc mục đã hết hạn. Kiểm TTL và scope của lần ghi trước.

Luôn khớp. Node chạy sau remember, nên ứng viên khớp chính nó. Đảo thứ tự.

Khớp nhầm mục. Dung sai quá lỏng. Siết phép so.

Node rẽ Fatal. Biểu thức sai hoặc tham chiếu thứ không dùng được.

FAQ

Nó tìm trong scope cụ thể không? Không — đọc xuyên scope. Tên bộ nhớ định danh kho.

Nó cho biết mục nào khớp không? Mô hình hiện tại chỉ rẽ matched/notMatched. Lưu thứ cần vào biến trước phép kiểm.

Mục hết hạn có tính? Không. Chỉ mục sống được định giá.

Dùng AND và OR cùng lúc được không? Được, trong biểu thức — &&||.

Node liên quan

  • Runtime Memory — ghi các mục node này đọc
  • Variable — chuẩn bị giá trị ứng viên
  • Read Text — thường cấp định danh
  • If — so biến trơn

Trang liên quan