Cấu trúc dữ liệu tối ưu cho API riêng của chúng tôi


10

Tôi đang ở giai đoạn đầu viết chế độ chính của Emacs cho mạng Stack Exchange ; nếu bạn sử dụng Emacs thường xuyên, điều này sẽ có lợi cho bạn cuối cùng.

Để giảm thiểu số lượng cuộc gọi được thực hiện cho API của Stack Exchange (giới hạn ở mức 10000 mỗi IP mỗi ngày) và để trở thành một công dân có trách nhiệm chung, tôi muốn lưu trữ thông tin tôi nhận được từ mạng và lưu trữ trong bộ nhớ, chờ được truy cập lại. Tôi thực sự bế tắc về cấu trúc dữ liệu để lưu trữ thông tin này.

Rõ ràng, nó sẽ là một danh sách. Tuy nhiên, như với bất kỳ cấu trúc dữ liệu nào, sự lựa chọn phải được xác định bởi dữ liệu nào đang được lưu trữ và cách thức nó sẽ được truy cập. Điều gì, tôi muốn có thể lưu trữ tất cả các thông tin này trong một biểu tượng duy nhất như stack-api/cache. Vì vậy, không cần phải quảng cáo thêm, stack-api/cachelà một danh sách các nhược điểm được cập nhật lần cuối:

`(<csite> <csite> <csite>)

<csite>sẽ ở đâu

(1362501715 . <site>)

Tại thời điểm này, tất cả những gì chúng tôi đã làm là xác định một danh sách liên kết đơn giản . Tất nhiên, chúng ta phải đi sâu hơn .

Mỗi cái <site>là một danh sách các tham số API (duy nhất) theo sau là một câu hỏi danh sách:

`("codereview" <cquestion> <cquestion> <cquestion>)

Mỗi người <cquestion>, bạn đoán nó, một nhược điểm của câu hỏi với thời gian cập nhật cuối cùng của họ:

`(1362501715 <question>) (1362501720 . <question>)

<question>là một nhược điểm của questioncấu trúc và danh sách các câu trả lời (một lần nữa, được chấp nhận với thời gian cập nhật cuối cùng của chúng ):

`(<question-structure> <canswer> <canswer> <canswer>

và `

`(1362501715 . <answer-structure>)

Cấu trúc dữ liệu này có thể được mô tả chính xác nhất như một cái cây, nhưng tôi không biết liệu có cách nào tốt hơn để xem xét ngôn ngữ này không, Emacs Lisp (không khác gì so với Lisp mà bạn biết và yêu thích cả ) . Những nhược điểm rõ ràng có thể không cần thiết, nhưng nó giúp bộ não của tôi bao bọc nó tốt hơn. Tôi khá chắc chắn <csite>, ví dụ, sẽ biến thành

(<epoch-time> <api-param> <cquestion> <cquestion> ...)

Mối quan tâm:

  • Việc lưu trữ dữ liệu trong một cấu trúc có khả năng lớn như thế này có bất kỳ sự đánh đổi hiệu năng nào cho hệ thống không? Tôi muốn tránh lưu trữ dữ liệu không liên quan, nhưng tôi đã làm những gì có thể và tôi không nghĩ bộ dữ liệu đó lớn ở nơi đầu tiên (đối với sử dụng bình thường) vì tất cả chỉ là văn bản có thể đọc được ở người theo tỷ lệ hợp lý. (Tôi đang lên kế hoạch loại bỏ dữ liệu cũ bằng cách sử dụng thời gian ở đầu danh sách; mỗi lần thừa hưởng thời gian cập nhật lần cuối từ con cái của nó và trên cây. Ở mức độ nào thì việc hủy bỏ này sẽ diễn ra: Tôi không chắc chắn rồi.)
  • Việc lưu trữ dữ liệu như thế này có bất kỳ sự đánh đổi hiệu suất nào đối với việc phải sử dụng nó không? Đó là, sẽ thiết lập và truy xuất các hoạt động phải chịu kích thước của danh sách?

Bạn có gợi ý nào khác về cấu trúc tốt hơn trông như thế nào không?


Tôi là 1 người vì tôi thực sự muốn chế độ này
Daniel Gratzer

@jozefg Tôi thực sự muốn nó quá. Thực tập sinh này đã chiếm phần lớn thời gian của tôi, nhưng một khi trường học bắt đầu một số tiến bộ hơn nên được thực hiện .
Sean Allred

Tôi đã rất vui khi chỉ cài đặt một plugin trình duyệt cho phép tôi sử dụng Emacs để điền vào nội dung hộp văn bản. Bạn sẽ có Emacs hiểu đánh dấu Wiki và hiển thị văn bản được định dạng?
kevin cline

@kevincline Không, ý tưởng là nó sẽ chỉ thực hiện các nhiệm vụ thực dụng: lưu trữ câu hỏi địa phương; chỉnh sửa mã nâng cao (bopping ra đúng chế độ chính, tương tự org); chèn vào <!-- language: blah>nơi cần thiết (tùy thuộc vào chế độ chỉnh sửa mã được thực hiện); những thứ như thế. Xem README trên GitHub để biết thêm thông tin và cảm thấy hoan nghênh nhất khi đề xuất các tính năng. Tôi càng biết nhiều về điều này trước khi ra tay, nó càng có thể được thiết kế tốt hơn. chỉnh sửa không đề cập đến keybindings của emacs;)
Sean Allred

Câu trả lời:


1

Emacs lisp không được tối ưu hóa để xử lý dữ liệu; bạn có thể thấy thuận lợi khi sử dụng Lisp chung cho động cơ và Emacs chỉ để trình bày.

Ngay cả khi bạn quyết định gắn bó với Emacs Lisp, tôi khuyên bạn nên sử dụng dữ liệu có cấu trúc ( eieio) thay vì danh sách và bảng băm thay vì tạm dừng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.