2010-09-02 10 views
8

Tôi muốn tìm và tái sử dụng (nếu có thể) một việc thực hiện bản đồ trong đó có các thuộc tính sau:thích ứng Maps trong Scala (hoặc Java) Bảo tồn Insertion tự

  1. Trong khi số lượng các mục nhỏ, nói < 32, lưu trữ cơ bản nên được thực hiện trong một mảng như thế này [key0, val0, key1, val1, ...] Sơ đồ lưu trữ này tránh nhiều đối tượng Entry nhỏ và cung cấp cho up nhìn rất nhanh (thậm chí tho họ quét tuần tự!) trên CPU hiện đại do bộ nhớ cache của CPU không bị vô hiệu và thiếu con trỏ gián tiếp vào heap.

  2. Bản đồ nên duy trì trật tự chèn cho cặp khóa/giá trị không phụ thuộc vào số lượng các mục tương tự như LinkedHashMap

Chúng tôi đang làm việc trên một trong bộ nhớ cơ quan đại diện của rất lớn (hàng triệu nút/cạnh) các đồ thị trong Scala và có một Map như vậy sẽ cho phép chúng ta lưu trữ các thuộc tính Node/Edge cũng như Edges trên mỗi nút theo cách hiệu quả hơn cho 99% + các nút và các cạnh có ít thuộc tính hoặc hàng xóm trong khi vẫn giữ thứ tự chèn thời gian cho cả hai thuộc tính và cạnh.

Nếu có ai biết về bản đồ Scala hoặc Java với các đặc điểm như vậy, tôi sẽ có nhiều nghĩa vụ.

Thanx

+1

Để tham khảo, tôi lưu ý rằng OP không tìm thấy giải pháp của tôi thỏa đáng và yêu cầu tôi xóa nó. Tóm lại, ý tưởng là đặt tất cả mọi thứ trong các mảng được lập chỉ mục, kiểu Fortran, nhưng sau đó viết các trình bao bọc đẹp xung quanh cấu trúc này để nó dễ chịu để giải quyết. Ưu điểm của phương pháp này là nó cực kỳ nhanh (do chủ yếu chỉ sử dụng nguyên thủy) và tự nhiên bảo tồn thứ tự chèn (vì bạn chỉ cần thêm 1 vào chỉ mục của mình khi bạn cần một mục nhập mới). Nhiều công việc đồ thị trong Fortran và C đã được thực hiện theo cách này, nhưng tôi đồng ý rằng tôi đã không xác định được bản đồ mong muốn. –

+0

Vì bạn đã suy nghĩ về việc thực hiện, tại sao bạn không viết của riêng bạn? Nó không thể là khó để viết một wrapper xung quanh một mảng hoặc một LinkedHashMap. – starblue

+1

Bạn đang sử dụng bộ sưu tập của mình cho một trường hợp đặc biệt. do đó bạn không nên bận tâm đến cách tiết kiệm như vậy. nó sẽ là thú vị để tạo ra datastrukture của riêng bạn, để có được một hiệu suất cao hơn. bạn có thể tối ưu hóa strukture của bạn cho trường hợp của bạn, bởi vì có vẻ như bạn biết rất nhiều đồ thị của bạn. vì vậy bạn nên suy nghĩ về cây cối, danh sách, bất cứ điều gì, để có được hiệu suất cao nhất có thể từ nó. có lẽ bạn sẽ có được hiệu suất runtine của O (n * logn) hoặc ít hơn ....;) –

Trả lời

0

Dưới java bạn có thể duy trì mảng 2d (bảng tính). Tôi đã viết một chương trình mà về cơ bản xác định một mảng 2 d với 3 coloumns dữ liệu, và 3 coloumns để tra cứu dữ liệu. ba coloumns là testID, SubtestID và Mode. Điều này cho phép tôi về cơ bản tìm kiếm một giá trị bằng testid và chế độ hoặc bất kỳ kết hợp nào, hoặc tôi cũng có thể tham chiếu bằng vị trí tĩnh. Bảng được nạp vào bộ nhớ khi khởi động và được tham chiếu bởi chương trình. Nó có thể mở rộng không ngừng và các giá trị mới có thể được thêm khi cần thiết.

Nếu bạn quan tâm, tôi có thể đăng một ví dụ nguồn mã tối nay.

Một ý tưởng khác có thể là duy trì cơ sở dữ liệu trong chương trình của bạn. Cơ sở dữ liệu được thiết kế để tổ chức một lượng lớn dữ liệu.

+0

Câu trả lời này không giải quyết được câu hỏi hẹp cụ thể của tôi Bản đồ thích ứng. Chúng tôi đã xem xét các biểu diễn đồ thị khác, nhưng vì nhiều lý do kỹ thuật mà tôi không thể đi vào, chúng ta phải duy trì một thiết kế "bản địa hóa" ở đó các đồ thị Nodes, Edges, vv (tất cả các nguyên tử thực sự) phải có các đối tượng bản đồ riêng của chúng. Một lần nữa, tôi muốn tránh một dạng chung của việc có nhiều đối tượng Map.Entry nhỏ cho nhỏ (<32 bản đồ nhập) để lưu vào bộ nhớ và duy trì vị trí bộ nhớ cache trên CPU (tức là quét qua một mảng nhỏ luôn luôn nhanh hơn trong thực hành hơn là theo một chuỗi các con trỏ heap). –

1

Mặc dù tôi không biết bất kỳ triển khai nào phù hợp với yêu cầu của bạn, bạn có thể quan tâm đến việc xem trộm số Flat3Map (source) trong thư viện Jakarta Commons. Thật không may, các thư viện Jakarta khá lạc hậu (ví dụ, không hỗ trợ cho Generics trong bản phát hành ổn định mới nhất, mặc dù nó hứa hẹn sẽ thấy rằng điều này đang thay đổi trong thân cây) và tôi thường thích Google Collections, nhưng nó có thể có giá trị thời gian của bạn để xem cách Apache thực hiện mọi thứ.

Flat3Map không giữ thứ tự các khóa, thật không may, nhưng tôi có đề xuất liên quan đến bài đăng gốc của bạn. Thay vì lưu trữ các khóa và giá trị trong một mảng đơn lẻ như [key0, val0, key1, val1, ...], tôi khuyên bạn nên sử dụng các mảng song song; có nghĩa là, một mảng với [key0, key1, ...] và một mảng khác có [val0, val1, ...]. Thông thường tôi không phải là người đề xuất các mảng song song, nhưng ít nhất theo cách này bạn có thể có một mảng kiểu K, loại khóa của bạn và một loại V khác, loại giá trị của bạn. Ở cấp Java, điều này có bộ mụn cóc riêng của nó vì bạn không thể sử dụng cú pháp K[] keys = new K[32]; thay vào đó, bạn sẽ cần sử dụng a bit of typecasting.

+0

Bây giờ, đây là * một loại câu trả lời mà tôi đang tìm kiếm. Trong công việc trước đây của tôi, tôi thấy rằng các bản đồ "phẳng" (như apache ppl gọi chúng) trở nên chậm hơn bản đồ băm tiêu chuẩn chỉ sau 32 hoặc thậm chí 64 mục, có thể là do CPU hiện đại có rất tốt trên bộ đệm lõi và con trỏ hướng vào đống gây ra bộ nhớ quầy hàng. Lý tưởng nhất là chuyển đổi từ "phẳng" sang bản đồ chuẩn sẽ xảy ra dựa trên ngưỡng có thể định cấu hình. Tôi sẽ upvote câu trả lời này nhưng điều đó sẽ loại bỏ các câu hỏi từ hàng đợi Unaswered :-) Tôi muốn giữ cho câu hỏi nổi bật trong một thời gian ngắn hơn. Cảm ơn câu trả lời của bạn. –

1

Bạn đã đo bằng profiler chưa nếu LinkedHashMap quá chậm đối với bạn? Có lẽ bạn không cần bản đồ mới đó - tối ưu hóa sớm là gốc rễ của tất cả những điều xấu xa .. Dù sao để xử lý hàng triệu hoặc nhiều mẩu dữ liệu trong một bản đồ thứ hai, thậm chí được tối ưu hóa tốt nhất có thể quá chậm, bởi vì mọi cuộc gọi phương thức cũng làm giảm hiệu suất trong các trường hợp đó. Sau đó, tất cả những gì bạn có thể làm là viết lại các thuật toán từ các bộ sưu tập Java thành các mảng (tức là int -> các bản đồ đối tượng).

+0

Vấn đề không phải là tốc độ hay không chỉ là tốc độ, nó cũng là số lượng các đối tượng Emtry nhỏ được phân bổ, giữ lại và GC'ed. –

+0

Nhưng thời gian phân bổ thêm vào sự chậm chạp - các đối tượng bạn phân bổ chương trình chậm hơn là, do đó, tất cả đều giảm xuống hiệu suất đo bằng lược tả. – iirekm

+0

Ngày nay, hầu hết các máy tính có tối ưu hóa bộ nhớ sử dụng bộ nhớ 4GB ít khi có ý nghĩa. Tuy nhiên khi có, thường là tốt nhất để sử dụng mô hình Flyweight. Một ví dụ có thể được tìm thấy trong TreeModel từ Java Swing. thay vì node.getAttribute (key) = node.attributeMap.get (key) sử dụng một cái gì đó như node.getAttribute (key) = graph.attributeModel.getAttribute (node) – iirekm

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