get for UArray blows the heap for large arrays
- 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