• картман © (08.02.17 03:35) [0]
    Нужно хранить данные, постоянно перезаписывая. Размер варьируется в неизвестных пределах. Как
    А) хранить информацию о доступных кусках(как выделять для нового объекта)?
    Б) наименее болезненно дефрагментировать чуть?
  • картман © (08.02.17 03:36) [1]
    Много записей разного размера в одном файле
  • stas © (08.02.17 07:48) [2]
    т.е. кусок в середине может быть перезаписан с другим размером?
  • DayGaykin © (08.02.17 09:51) [3]
    Сделай как я предложил: цепочками равных буфферов. И предложи использовать ssd, тогда дефрагментировать не нужно будет.
  • Kerk © (08.02.17 10:34) [4]
    Буду не оригинален :)
    Делай не один файл, а много. Пусть об их хранении думает файловая система. Если один файл - это критичное требование, то зипуй.
  • Pavia © (08.02.17 10:42) [5]
    У Rouse была статья
    https://habrahabr.ru/post/254541/

    Если изобретать свой велосипед. то вам нужно воспроизвести FAT или ext2.
    Второй лучше так как основан на B+ деревьях.
    Она экономично по памяти, работает быстрее, оптимизирована для работы с HDD. Рассчитан на произвольный размер так как набирается из нодев  нужного размера. Дефрагментацию на первых парах можно упростить до супернодов. Практически безболезненно расширяется прибавлением нового пространства.
  • картман © (08.02.17 11:31) [6]

    > stas ©   (08.02.17 07:48) [2]
    > т.е. кусок в середине может быть перезаписан с другим размером?

    Да.

    Спасибо, но нет, не подходит.
    Нужны менеджер памяти и дефрагментатор.
  • stas © (08.02.17 11:53) [7]

    > DayGaykin ©   (08.02.17 09:51) [3]
    >  И предложи использовать ssd

    Если файл фрагментирован, то без разницы ssd или нет.


    > картман ©   (08.02.17 11:31) [6]


    Использовать маркеры начала части,конца части и удаленной части, если перезаписывается часть, то записываем ее в конец файла, а старую помечаем как удаленную. Потом дефрагментатор убирает удаленные части и все смещает.
  • картман © (08.02.17 12:10) [8]

    > stas ©   (08.02.17 11:53) [7]

    вопрос в том, как это делать максимально быстро: сотня читающих потоков, десяток пишущих, задержки должны быть минимальны.
  • stas © (08.02.17 12:17) [9]
    картман ©   (08.02.17 12:10) [8]
    Дефрагментация потом. т.е. файл будет расти до какого-то придела потом дефрагментация.
  • Eraser © (08.02.17 12:17) [10]

    > stas ©   (08.02.17 11:53) [7]


    > Использовать маркеры начала части,конца части и удаленной
    > части, если перезаписывается часть, то записываем ее в конец
    > файла, а старую помечаем как удаленную. Потом дефрагментатор
    > убирает удаленные части и все смещает.

    СУБД.
    кстати, возможно, использование готовой СУБД лучший вариант.
  • DayGaykin © (08.02.17 13:04) [11]

    > stas ©   (08.02.17 11:53) [7]
    > > DayGaykin ©   (08.02.17 09:51) [3]
    > >  И предложи использовать ssd
    > Если файл фрагментирован, то без разницы ssd или нет.

    Почему? Очевидно, что SSD не нужно тратить время на перемещение головок и ожидание позиции диска.
  • NoUser © (08.02.17 15:35) [12]
    Определится с минимальным размером блока и (A) битмап на блоки для контроля их занятости.

    > вопрос в том, как это делать максимально быстро:
    ну, не быстрее железа, да?

    > сотня читающих потоков,
    у тебя Intel Phi?  ))

    > десяток пишущих,
    достаточно/проще/правильней один с очередью заданий.
    ( новая версия записи всегда в другое/новое место - не нужна будет длительная синхра с читателями (только на доступе к позиции/индексу) )
    ( и будет точка, которая сможет ограничивать скорость поступления данных возможностями внешнего носителя  )

    > задержки должны быть минимальны.
    отдельный поток по поиску/учету/составлению списка свободных участков
    ( алгоритмы можно поискать )

    > Б) наименее болезненно дефрагментировать чуть?
    не нужно, или offline
    ( или начинать писать все записи в новый файл/носитель до утраты актуальности старого )

    Вопрос хранения позиции/индекса записи не озвучен - думаю там всё понятно ))
  • stas © (08.02.17 16:09) [13]

    > DayGaykin ©   (08.02.17 13:04) [11]

    Я так понимаю имелась ввиду фрагментация в виде не используемых данных, которые можно удалить и уменьшить размер файла.
  • картман © (08.02.17 16:30) [14]

    > NoUser ©   (08.02.17 15:35) [12]


    ну да, спасибо.

    Я для клевого авто нужно четыре колеса, мотор и руль; для шикарности можно добавить кондиционер и дверья))
  • Kerk © (08.02.17 16:36) [15]
    С СУБД хорошая идея.
  • NoUser © (08.02.17 17:03) [16]

    > картман ©   (08.02.17 16:30) [14]


    пожалуйста.

    ???
  • cryptologic © (12.02.17 04:09) [17]
    Ваша проблема из разряда "вырезать гланды через задний проход"
    Если у вас изменяющиеся в размере блоки в файле
    1. вынесите их за пределы файла в отдельные файлы
    2. если 1 не возможно, то выделяйте под каждый блок максимальный размер буфера что бы все данные наверняка уместились с запасом их изменения
    3. если размер записи блока незначителен т.е. не рационален для создания отдельного файла то вариант использовать БД или СУБД
Есть новые Нет новых   [134431   +13][b:0][p:0.001]