Вот я создал файл. Размером в 6 гигабайт. Есть 100 человек, которые желают его прочитать, и еще 2200 желают в него что-то написать. Причем эти товарищи хотят все это сделать прямо сейчас. Как быть? Щас вы мне скажете: Используй блокировку. Но если так, то пока один не запишет - другой будет ждать. А как, например, работают субд MySQL, Postgres, FireBird? PS.: Сейчас вот что происходит: к файлу "user_data.txt" из сети лезут две с половиной тыщи человек непонятно с какими намерениями Чего делать?
device Но, эти 2200 человек, ведь не печатают прямо в файл?..А для того, чтобы "сохранить изменения", вроде, и не так много времени нужно?
Ну, хорошо. Допутим, с пишущими понятно - можно организовать очередь и пускать по одному юзеру. А с читающими как? Я просто боюсь что скорость работы будет очень медленная. Сеть отключил нафиг. Достали. Схема может быть такая: читатель (Ждет) Писатель (ждет) писатель (ждет) писатель (пишет) потом читатель (ждет) писатель (ждет) писатель (пишет) писатель (кончил, сказал об этом своему соседу, пошел умирать) Конченные писатели умирают первыми
device > А как, например, работают субд MySQL, Postgres, FireBird? так они не с текстовыми файлами работают текстовой файл _такого_ размера вообще ужасная штука, особенно если запись происходит в середину с раздвижной. тогда точно все кто в очереди сдохнут и отвалятся по тайм-ауту. ну а так, в целом, алгоритм такой: огранизуем данные на худой конец в виде списка из блоков размеров с кластер, и блокируем только те блоки, в которые происходит запись, а можно и не блокировать, просто при начале записи создавать копию блока, а по окончании замещать ее в списке, тогда время блокировки сократиться до времени замещения блока данных в списке, что стоит всего несколько операций записи в память (где хранится кэш ссылок . как бонус можно предусмотреть уведомления клиентам, что данные которые они загрузили - изменились. все это будет очень быстро работать с огромным кол-вом человек
device Читающим рассылаешь копии файла, при появлении изменений в файле - копии обновляются. В случае с пишущими в файл (по аналогии с БД) распределяются права - пользователь А может писать только в фрагмент файла #1, пользователь Б в #2 и т.д.
device Точно так же как работает кэш процессоров. У тебя есть огромный файл - разбей его на ряд мелких регионов далее лок региона и запись. Возможно будет лок соседних регионов. В итоге если все хотят записать в одно место - будут ждать если в разные - пожалуйста Есть еще нюанс - различный вид доступа (чтение или запись) - вот тут главное в кучу все не смешивать - любая запись в регион - оповещение клиента читающего его. + конечно асинхронный вызов процедур и опираться на пул потоков в виндовс, а не создавать свои для каждого обращения. Собственно эта штука так хорошо организована в серверных вариантах винды, что порой обгоняет линукс по скорости.