haskell / haskell/binary

get for UArray blows the heap for large arrays

Đang mở
#34 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Haskell
Star
120
Fork
70
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

``` haskell
instance (Binary i, Ix i, Binary e, IArray UArray e) => Binary (UArray i e) where
get = do
bs <- get
n <- get
xs <- getMany n
return (listArray bs xs)
```

getMany is fully strict in the list, since it uses an accumulator and reverses it at the end. The intermediate xs list can be huge in cases where the eventual UArray is much more manageable (eg 28M Booleans).

Two questions:

1) Is there a known alternative for (un)serializing UArrays to(from) disk? Such an alternative would make this Issue far less important.

2) Have you considered a version that serializes the bytes directly? I drafted one up; it's tremendously more efficient, though I'm concerned about robustness wrt endianness etc. Furthermore, it requires a base monad that can mutate arrays, which requires an "unsafe" invocation. And lastly it's not portable, using ghc-prim.

HTH. Thanks.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu với instance get của Binary (UArray i e) và đường dẫn getMany của nó, tái hiện việc giải mã một Boolean UArray lớn để đo mức sử dụng bộ nhớ của danh sách trung gian. Xem xét cách tiếp cận direct-byte được đề xuất dựa trên endianness, tính khả biến, khả năng chuyển đổi của ghc-prim và các phương án thay thế cho việc tuần tự hóa trên đĩa. Hoàn tất có nghĩa là đã thống nhất phạm vi và có một đường dẫn tuần tự hóa UArray đã được kiểm thử, tránh việc heap phình to.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
haskell
Lĩnh vực
data
Loại issue
Lỗi
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
25/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.