Saving a multi-segment recording fails when only some segments have a t_start
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 84/100
Hướng nghiên cứu
Bắt đầu với ba constructor được nêu trong issue: NumpyRecording và SharedMemoryRecording trong src/spikeinterface/core/numpyextractors.py, và BinaryRecordingExtractor trong src/spikeinterface/core/binaryrecordingextractor.py. Đọc cách từng constructor xử lý get_segment_t_starts, sau đó chạy bước tái hiện lỗi và các bài kiểm thử recording và binary extractor được nêu tên. Công việc hoàn tất khi các bản lưu nhị phân và trong bộ nhớ giữ nguyên các thời điểm bắt đầu hỗn hợp và traces, đồng thời không để lại shared memory chưa được giải phóng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
get_segment_t_starts returns a mixed list such as [None, 100.0] when only some segments have a start time. Three constructors then call float() on every entry. This happens with append_recordings([rec_without_t_start, rec_with_t_start]), and more generally when shift_times has been applied to only some segments.
Reproduction
main at 9ef464e66, Linux (WSL Ubuntu 24.04), Python 3.12.3, numpy 2.5.4, zarr 3.4.2:
import spikeinterface.core as sc
a = sc.generate_recording(num_channels=2, sampling_frequency=1000.0, durations=[3.0], seed=0)
b = sc.generate_recording(num_channels=2, sampling_frequency=1000.0, durations=[2.0], seed=1)
b.shift_times(100.0)
rec = sc.append_recordings([a, b])
print(rec.get_segment_t_starts(), [rec.get_start_time(i) for i in range(2)])
for kwargs in [
dict(format="binary", folder="rec_binary"),
dict(format="memory", shared_memory=False),
dict(format="memory", shared_memory=True),
dict(format="zarr", folder="rec.zarr"),
]:
try:
saved = rec.save(**kwargs)
print(kwargs["format"], "OK", [saved.get_start_time(i) for i in range(2)])
except TypeError as ex:
print(kwargs["format"], f"TypeError: {ex}")
[None, 100.0] [0.0, 100.0]
binary TypeError: float() argument must be a string or a real number, not 'NoneType'
memory TypeError: float() argument must be a string or a real number, not 'NoneType'
memory TypeError: float() argument must be a string or a real number, not 'NoneType'
zarr OK [0.0, array(100.)]
Three details make this worse:
- Binary: the exception comes after all traces are written. In the example,
rec_binarycontainstraces_cached_seg0.rawandtraces_cached_seg1.raw, but neitherbinary.jsonnorsi_folder.json. For a long recording, this means that hours of writing end in a folder that cannot be loaded. - Shared memory: the exception comes before
self.main_shm_owneris set, so__del__raisesAttributeError: 'SharedMemoryRecording' object has no attribute 'main_shm_owner', and the segments are not unlinked. The script ends withresource_tracker: There appear to be 4 leaked shared_memory objects to clean up at shutdown. - Zarr: saving works, but
get_start_time(1)returns a 0-darray(100.)instead of a float.
Cause
get_segment_t_starts only returns None when all segments have no start time. The conversion is in NumpyRecording, SharedMemoryRecording and BinaryRecordingExtractor. In SharedMemoryRecording, main_shm_owner is set after this line, and __del__ reads it.
Possible fix
In the three constructors, keep None:
t_starts = [None if t_start is None else float(t_start) for t_start in t_starts]
With this, the binary and both memory saves work, with start times [0.0, 100.0] and identical traces, and the script no longer reports leaked segments. test_basesorting.py, test_baserecording.py, test_binaryfolder.py, test_binaryrecordingextractor.py and test_numpy_extractors.py still pass (33 tests).
Two separate points would remain: setting main_shm_owner before anything that can fail, so that __del__ is safe after another error, and the 0-d array from zarr. I have not changed them.
I found no report of this case. Nearby: #2515 and #3120 (t_starts lost by save_to_memory) and #3940 (shift_times when t_start is None). I can open a PR with this change and a round-trip test.
- Ngôn ngữ chính
- Python
- Star
- 870
- Fork
- 284
- Merge trung bình
- 3 ngày 1 giờ
- Pull request đã merge (30 ngày)
- 41
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của SpikeInterface/spikeinterface
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
SpikeInterface/spikeinterface#4842 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
SpikeInterface/spikeinterface#4510 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
MountainSort5: expose `pca_seed` / `random_seed` sorter param (pair with MS5 configurable PCA seed)Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 43/100
SpikeInterface/spikeinterface#4919 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
BaseSorting.select_periods() drops properties, annotations and the registered recordingCó thể đã có người làm @AxelNoun đã nhận hôm nay. Đang mởbug core
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 20/100
SpikeInterface/spikeinterface#4915 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Optional dependencies don't participate in extension invalidationCó thể đã có người làm @alejoe91 đã nhận hôm nay. Đang mởbug core
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
SpikeInterface/spikeinterface#4912 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của SpikeInterface/spikeinterface
Issue tương tự
-
[MOVIE]: Airport '77 (1977)Đang mởrequest-theme
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 78/100
LizardByte/ThemerrDB#9883 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
Project-MONAI/MONAI#9258 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
catalog:deprecation
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
surendranb/free-inference#31 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
fritzprix/libr-agent#2612 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-triage presubmit-gate
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
gke-labs/kube-agents#5001 ·
Maintainer thường phản hồi trong vòng 1 ngày