Jak skutecznie przechowywać i aktualizować dane binarne w Mongodb?

Przechowuję dużą tablicę binarną w dokumencie. Chcę ciągle dodawać bajty do tej tablicy i czasami zmieniać wartość istniejących bajtów.

Szukałem modyfikatorów typu $ append_bytes i $ replace_bytes, ale wydaje mi się, że najlepsze, co mogę zrobić, to $ push for tablice. Wydaje się, że byłoby to wykonalne, wykonując operacje typu „szukaj-pisz”, gdybym miał jakoś dostęp do ukrytego pliku na dysku, ale nie wydaje mi się, że jest to możliwe w mongodb (i prawdopodobnie z ważnego powodu).

Gdybym tylko zapytał o tę tablicę binarną, edytował ją lub dodawał, a następnie aktualizował dokument, przepisując całe pole, jak to będzie kosztowne? Każda tablica binarna będzie rzędu 1-2 MB, a aktualizacje będą wykonywane raz na 5 minut i na tysiącach dokumentów. Co gorsza, nie ma jednak łatwego sposobu na ich rozłożenie (na czas) i zazwyczaj będą się one odbywać blisko siebie w pięciominutowych odstępach. Czy ktoś ma dobre wyczucie, jak to będzie katastrofalne? Wydaje się, że byłoby to problematyczne.

Alternatywą byłoby przechowywanie tych danych binarnych jako oddzielnych plików na dysku, zaimplementowanie puli wątków w celu wydajnego manipulowania plikami na dysku i odniesienie nazwy pliku z mojego dokumentu mongodb. (Używam python i pymongo, więc szukałem pytables). Wolałbym jednak tego uniknąć, jeśli to możliwe.

Czy jest jakaś inna alternatywa, którą tu przeoczę?

Dzięki w advnace.

EDYTOWAĆ

Po kilku pracach nad napisaniem testów dla moich przypadków użycia zdecydowałem się użyć oddzielnego systemu plików dla obiektów danych binarnych (szczególnie hdf5 przy użyciu pytables lub h5py). Nadal będę używać mongo do wszystkiego oprócz trwałości tych obiektów danych binarnych. W ten sposób mogę oddzielić wydajność związaną z dołączaniem i aktualizowaniem operacji typu od mojej podstawowej wydajności mongo.

Jeden z deweloperów mongo zauważył, że mogę ustawić wewnętrzne elementy tablicy za pomocą notacji kropkowej i $ set (patrz ref w komentarzu poniżej), ale w tym momencie nie ma sposobu, aby wykonać zbiór zbiorów w tablicy w sposób atomowy.

Co więcej - jeśli mam 1000 pól danych binarnych o rozmiarze 2 MB w moich dokumentach mongo i aktualizuję je i często je rozwijam (co najmniej raz na 5 minut) - moje przeczucie mówi mi, że mongo będzie musiał zarządzać wieloma problemy z alokacją / wzrostem w plikach na dysku - i to ostatecznie doprowadzi do problemów z wydajnością. Wolałbym raczej odciążyć go do osobnego systemu plików na poziomie systemu operacyjnego, aby go obsłużyć.

Wreszcie - będę manipulować i wykonywać obliczenia na moich danych za pomocą numpy - zarówno moduły pytables, jak i h5py pozwalają na ładną integrację między zachowaniem numpy a sklepem.

questionAnswers(1)

yourAnswerToTheQuestion