powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Queue с поддержкой сериализации на диск.
200 сообщений из 200, показаны все 8 страниц
Queue с поддержкой сериализации на диск.
    #39904248
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужна реализация некой системы буферизации бизнес сущностей
в очередь с возможностью хранения этой очереди на диске.
Оперативы не хватает когда заходит дата-провайдер из китая
и миллиардами сущностей.

Интерфейс:
Код: java
1.
2.
3.
4.
5.
interface Q {
   add(Object entity);
   remove(Object entity);
   purge();
}


Не рассматривал базы данных т.к. это оверхед и сортировки по дате всегда тормознутые.
И Амазон слишком дорого берет за поднятие базячных иснтасов а мне их надо будет поднять
для девов штук 4 и для нужд тестинга еще штук 16.

Рассматривал :
- BerkeleyDb (там вроде очередь поддерживается)
- Redis (не Java-native)
- KahaDb (из репозитария Apache ActiveMQ).

Ничего из этого я еще не тестил и не смотрел. Поэтому можете писать свои мысли.

Крутится всё это будет пока на Amazon EC2 instances с блинами типа SSD на 30 Гиг (я надеюсь).
Тоеть под каждую очередь у меня будет где-то 30 минус операционка с барахлом софта и логами.

Планирую также предусмотреть метод purge() для аварийной очистки очереди. Это в том
случае когда например из 2х узлов кластера 1 выпал навсегда - то надо рестаровать
все бизнес процессы на оставшихся нодах с чистого листа. События все равно зайдут
повторно и не нарушат процессинг (у нас поддерживается idempotency на всех уровнях).

Почему мне не подошли MQ системы? Ну по той причине что от MQ мне нужен был только персистенс.

Почему нам не подошла обычная файловая система типа ext4? Ну.... у нас были потоки entities мелкого
размера и мы переполняли файловую систему ext4 не по размеру файла а по inodes.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904274
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача совершенно не понятна.
Любой класс можно сериализовать. Ну и я так понимаю, проблема то не с Queue, а с "буферизации бизнес сущностей"
т.е. нужно или нормальное хранилище (база данных?) или какая нибудь система кэша с возможностью non-heap и хренанения на диске

mayton

Крутится всё это будет пока на Amazon EC2 instances с блинами типа SSD на 30 Гиг (я надеюсь).

AFAIK
кроме размера, Amazon еще и за IOPS деньги хочет
т.ч. не факт, что Amazon SSD на 30 Гиг это будет ровно то, что Вы думаете )))
по стандартной опции, IOPS должно быть кот наплакал

ext4 не по размеру файла а по inodes.

AFAIK
кол-во inodes в момент форматирование задается
на Amazon'е плодил несколько миллионов файлов по 500-800 байт, все нормально работало

потом перешел на SQLLite
Не рассматривал базы данных т.к. это оверхед и сортировки по дате всегда тормознутые.

IMHO и зря
Что такое база данных? Это B-tree + максимум лог (redo log). Если целостность не нужна, отключите синхронизацию при записи, оверхеда вообще будет не видно.

Использовал SQLLite. Оверхид вообще не заметен.

Что такое "сортировки по дате всегда тормознутые" мне вообще не понятно. Постройте индекс, будут "мгновенные"

Использовал SQLLite для миллионов строк, все летало. С миллиардами не пробывал )))

Достоинство по сравнению с файловой системой, все же добавить файл в файловую системая значительно больший оверхид, чем строчку в таблицу.
И Амазон слишком дорого берет за поднятие базячных иснтасов а мне их надо будет поднять
для девов штук 4 и для нужд тестинга еще штук 16.

Зачем вообще базячные инстансы от Амазона? Только если своих рук нет, базу поставить. А в случае с SQLite и ставить ничего не нужно. JAR в проект воткнул и все.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904280
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

AFAIK
кроме размера, Amazon еще и за IOPS деньги хочет
т.ч. не факт, что Amazon SSD на 30 Гиг это будет ровно то, что Вы думаете )))
по стандартной опции, IOPS должно быть кот наплакал

Мы регулируем S3 но не можем выйти на те паспортные параметры которые были анонсированы.
Пока есть ощущение что S3 требуется некий прогрев бакета. И все рекомендации по разделению
бакета на префиксы мы выполнили. Но пока по записи S3 плох. Я предполагаю что он больше
по чтению оптимизирован.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904284
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

кол-во inodes в момент форматирование задается
на Amazon'е плодил несколько миллионов файлов по 500-800 байт, все нормально работало

Да. Это щас - самый рабочий вариант на проверку. Но характер и род доступа к хранилищу
будет именно таким как я описал в абстрактном протколе "Q". И сущности могут быть мелкими.
меньше от нескольких байт до 4К. Выгодно их хранить или нет в ext4 ? Я не знаю. Но мой опыт
баз данных подсказывает что группировать их в более крупные сущности - выгоднее. При этом
не нарушая удобство "Q".
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904285
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Но пока по записи S3 плох.

Что под этим подразумевается? Как проверяете запись? И главное - чего ожидаете? Он вообще eventual consistent
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO и зря
Что такое база данных? Это B-tree + максимум лог (redo log). Если целостность не нужна, отключите синхронизацию при записи, оверхеда вообще будет не видно.

Использовал SQLLite. Оверхид вообще не заметен.

Что такое "сортировки по дате всегда тормознутые" мне вообще не понятно. Постройте индекс, будут "мгновенные"

Использовал SQLLite для миллионов строк, все летало. С миллиардами не пробывал )))

Достоинство по сравнению с файловой системой, все же добавить файл в файловую системая значительно больший оверхид, чем строчку в таблицу.
Вот как раз я и говорю что мне не нужна БД как таковая. Просто подойдет дисковая структура данных
которая сохраняет вид FIFO. А поскольку я ищу эконом-решение то база данных вроде как отпадает.
Можно подключить AmazonElastiCache (Redis) но это уже сетевая интеракция. Можно SQS. Но мой
последний опыт работы с SQS был резко негативным. Более неудобного API программирования
я нигде не видел.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904289
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
mayton

Но пока по записи S3 плох.

Что под этим подразумевается? Как проверяете запись? И главное - чего ожидаете? Он вообще eventual consistent

Это - тема отдельного топика. И я сейчас не хочу на ней зацикливать основную тему.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904293
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

Зачем вообще базячные инстансы от Амазона? Только если своих рук нет, базу поставить. А в случае с SQLite и ставить ничего не нужно. JAR в проект воткнул и все.

Я думаю что здесь кроется самая главная маркетинговая подстава. Действительно - зачем?
И я думаю что в амазоне сидят не дураки и они знают где так тонкая грань что продать и в каких условиях.
А база ставится через apt install postgres ... да. Это так.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904301
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С S3 работал только как пользователь, т.ч. не специалист

Все же S3 это не файловая система. Даже по логике, ожидать от нее быстрой работы я бы не стал. Да и доступ по сети (между нодами-машинками) вещь не быстрая. Плюс, подозреваю, если трафик пойдет между дата-центрами, то еще и на оплату трафика можно нарваться.

---

Не очень понятен требуемый функционал. Если бизнес-сущности поддерживают сериализацию. то написать свой Queue с буфферизацией - в общем-то несколько сотен строк кода.

Проблема производительности, как мне видится:

1) Скорость сериализации бизнес-сущности. Сам по себе стандартный механизм сериализации в Java тормозной до чертиков, как Java так умудряется, мне не понятно. Я переписывал на Externalizable.

2) Скорость сохранения на диске. Если бизнес-сущности можно сохранить в fixed size записи, то самое быстрое был бы просто Circle Ring Buffer на диске (сервер то выделеннй, сразу и нарезать буффер на все 30 Gb). Если нет (что скорее всего), то SQL Lite, что бы не изобретать буфферизацию записи/чтения на диск.

3) Входные объемы данных. Как я понимаю, если данные помещаются в ОП, то Вы можете работать в ОП (персистентность и защита от сбоев не требуется). Если не помещаются, то на диск. Но тут проблема, что тогда может быть сильный разнобой по скорости в зависимости от нагрузки, допустимо ли это или нужно всегда медленно, но зато стабильная скорость.

4) Требование от сбоев. Если требуется атомарность и гарантированное хранение информации, то быстрее IOPS'ов Amazon'а не прыгнуть. А их, насколько я помню, десятки, максимум сотни (или платите деньги). А 100-200 записей в секунду - как-то не много. Если при сбое все 30 Гб накрываются "медным тазом" и это нормально, то наверное на пару десятков мегабайт в секунду от локальных дисков расчитывать вполне можно.

Можно конечно в своем формате хранить или смотреть на какие нибудь продукты кэширования, но если что-то сложнее Circle Ring Buffer'а, то SQL Lite будет и проще и, скорее всего, быстрее.

p.s.
с точки зрения "велосипедостроения". Но без полноценной постановки, что же требуется, скорее всего разговариваем о разном.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904309
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Leonid Kudryavtsev

Зачем вообще базячные инстансы от Амазона? Только если своих рук нет, базу поставить. А в случае с SQLite и ставить ничего не нужно. JAR в проект воткнул и все.

Я думаю что здесь кроется самая главная маркетинговая подстава. Действительно - зачем?
И я думаю что в амазоне сидят не дураки и они знают где так тонкая грань что продать и в каких условиях.
А база ставится через apt install postgres ... да. Это так.


По опыту, SQLite минимум на порядок ( 7-8 раз и больше ) быстрее postgresql на точечных select'ах / insert'ах. Как минимум, отстутвует проблема меж-процессорного взаимодействия (задержки на localhost + переключение потоков/процессов).

Для проектов, где не требуется полноценная, отдельно стоящая база, а бы первым делом сейчас смотрел на SQL Lite.

А с учетом родовой травмы PostgreSQL (vacuum), для задачь типа subj, на PostgreSQL смотрел бы вообще в последнию очередь. IMHO & AFAIK

Если "не рассматривал базы данных т.к. это оверхед" ориентируясь на PostgreSQL, я бы порекомендовал пересмотреть свое мнение и попытаться сделать тесты производительности, что нужно, что получилось/не получилось с SQL Lite. Какие характеристики не достигнуты.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904318
kolchanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Почему нам не подошла обычная файловая система типа ext4? Ну.... у нас были потоки entities мелкого
размера и мы переполняли файловую систему ext4 не по размеру файла а по inodes.

В свое время была задача, где нужно было хранить несколько миллионов (но не миллиардов) коротких файлов в одной директории.
Прекрасно справлялся RaiserFS. Единственный недостаток - история с ее создателем.

Про миллиарды надо тестировать.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904321
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolchanov
>Почему нам не подошла обычная файловая система типа ext4? Ну.... у нас были потоки entities мелкого
размера и мы переполняли файловую систему ext4 не по размеру файла а по inodes.

В свое время была задача, где нужно было хранить несколько миллионов (но не миллиардов) коротких файлов в одной директории.
Прекрасно справлялся RaiserFS. Единственный недостаток - история с ее создателем.

Про миллиарды надо тестировать.

Мы попробуем средствами ext4. Или я запилю Berkeley или KahaDb.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904323
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
запилю Berkeley

Она же вроде денег стоит?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904325
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот только што скачал отсюдова https://www.oracle.com/database/technologies/related/berkeleydb-downloads.html
не заплатив ни шекеля.

Я помню что какое-то время у Оракла можно было взять либо легаси версию бесплатно либо последнюю с какими-то
ограничениями. Но щас вроде как либерально. Наверно эта беркли просто никому нахер не нужна. Ни в native ни в Java
варианте.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904328
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вспомнил. Точно. Вот здесь этот боян был бесплатным https://mvnrepository.com/artifact/berkeleydb/je/3.2.76
От 2008 года.

А у Оракла - будет какое-то заподлецо типа ограниченных возможностей.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904329
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The our open source license permits you to use Berkeley DB, Berkeley DB Java Edition or Berkeley DB XML at no charge under the condition that if you use the software in an application you redistribute, the complete source code for your application must be available and freely redistributable under reasonable conditions. If you do not want to release the source code for your application, you may purchase a license from Oracle.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... можно и так. Главное что они поддерживают 3 сериализируемые структуры. B+Tree, HashTable, Queue.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904340
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну с этой Беркли я уже когда-то давно работал. А с KahaDb? Не знаю. Потрачу пол-дня времени чтобы просто
осознать что оно может и не сильно надо.

Вот репка тут https://github.com/apache/activemq/tree/master/activemq-kahadb-store
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904347
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ну... можно и так. Главное что они поддерживают 3 сериализируемые структуры. B+Tree, HashTable, Queue.


BerkeleyDbSince the Queue access method always uses fixed-length records , the user must always set the record length prior to creating the database.

сущности могут быть мелкими.меньше от нескольких байт до 4К
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904350
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выж понимаете что у нас нет проблем с диском пока. У нас просто была проблема с нехваткой inodes.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904360
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Нужна реализация некой системы буферизации бизнес сущностей
в очередь с возможностью хранения этой очереди на диске.
Оперативы не хватает когда заходит дата-провайдер из китая
и миллиардами сущностей.

Интерфейс:
Код: java
1.
2.
3.
4.
5.
interface Q {
   add(Object entity);
   remove(Object entity);
   purge();
}


Не рассматривал базы данных т.к. это оверхед и сортировки по дате всегда тормознутые.
И Амазон слишком дорого берет за поднятие базячных иснтасов а мне их надо будет поднять
для девов штук 4 и для нужд тестинга еще штук 16.

Рассматривал :
- BerkeleyDb (там вроде очередь поддерживается)
- Redis (не Java-native)
- KahaDb (из репозитария Apache ActiveMQ).

Ничего из этого я еще не тестил и не смотрел. Поэтому можете писать свои мысли.

Крутится всё это будет пока на Amazon EC2 instances с блинами типа SSD на 30 Гиг (я надеюсь).
Тоеть под каждую очередь у меня будет где-то 30 минус операционка с барахлом софта и логами.

Планирую также предусмотреть метод purge() для аварийной очистки очереди. Это в том
случае когда например из 2х узлов кластера 1 выпал навсегда - то надо рестаровать
все бизнес процессы на оставшихся нодах с чистого листа. События все равно зайдут
повторно и не нарушат процессинг (у нас поддерживается idempotency на всех уровнях).

Почему мне не подошли MQ системы? Ну по той причине что от MQ мне нужен был только персистенс.

Почему нам не подошла обычная файловая система типа ext4? Ну.... у нас были потоки entities мелкого
размера и мы переполняли файловую систему ext4 не по размеру файла а по inodes.


http://swaydb.io/?language=java/

До 100 млн записей поддерживает.

Хорошего вам дня!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39904369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov, пардон но в ней не видно интерфейса очереди

http://swaydb.io/api/write/put/?language=java/

Возможно это обычная key-value хранилка? Но для меня это тоже избыточно.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905175
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolchanov
>Почему нам не подошла обычная файловая система типа ext4? Ну.... у нас были потоки entities мелкого
размера и мы переполняли файловую систему ext4 не по размеру файла а по inodes

- вроде это решается простым раскидыванием файлов по папкам. Или я что то путаю?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905180
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- вроде это решается простым раскидыванием файлов по папкам. Или я что то путаю?

не решается
но при форматировании диска можно задать любое кол-во inodes
AFAIK
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905207
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

HSQLDB смотрел?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton,

HSQLDB смотрел?

Там есть queue?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905418
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Там есть queue?

А у кого бд поддерживает такие структуры вообще? Если знаешь бд, которые умеют делать ссылки, то очень интересно. Так-то queue накостылить просто и скормить inmemory db, которая сбросит их на диск.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905558
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster, топик вообще не про БД!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39905892
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Рассматривал :
- BerkeleyDb (там вроде очередь поддерживается)
- Redis (не Java-native)
- KahaDb (из репозитария Apache ActiveMQ).

Нууу вот же.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906036
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Рассматривал :
- BerkeleyDb (там вроде очередь поддерживается)
- Redis (не Java-native)
- KahaDb (из репозитария Apache ActiveMQ).

Нууу вот же.

Хорошо. Давай зайдем с другой стороны. Как ты организуешь очередь FIFO в базе данных?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906043
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как ты организуешь очередь FIFO в базе данных?

Никак. Зачем её там огранизовывать? Очередь в яве, при добавлении/извлечении это всё сбрасывается в бд.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906048
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Как ты организуешь очередь FIFO в базе данных?

Никак. Зачем её там огранизовывать? Очередь в яве, при добавлении/извлечении это всё сбрасывается в бд.

Очередь большая. В память не влезает.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906050
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Очередь большая. В память не влезает.

Ленивую подгрузку какую-нибудь замутить. Нужна ли тут бд вообще? Я б закостылил что-нибудь на RandomAccessFile.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Очередь большая. В память не влезает.

Ленивую подгрузку какую-нибудь замутить. Нужна ли тут бд вообще? Я б закостылил что-нибудь на RandomAccessFile.

Ну вот если развивать идею то она и вытекает либо в RandomAccessFile либо в библиотеку.
Либо в коробочное решение которое вроде как Queue поддерживает (BerkeleyDb).
Костылить сейчас сразу свою библиотеку я не хочу. Объекты будут иметь вариативный размер
поэтому сама по себе структура их хранения в этом RAF будет не-тривиальной.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906062
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Очередь большая.
тут копай. Транзакции слишком длинные?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906064
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Костылить сейчас сразу свою библиотеку я не хочу.

Не, так не интересно. Сделал бы проект на гитхабе с тестами, а то пишут одни джуны со своими тз.
mayton
Объекты будут иметь вариативный размер поэтому сама по себе структура их хранения в этом RAF будет не-тривиальной.

Да ну. Обычная каша с разделителями. Ты же не будешь там по записям прыгать в случайном порядке, а читать сразу большими кусками от разделителя до разделителя, потом помечать, что вычитал, что отправил, где остановился.
mayton
Либо в коробочное решение которое вроде как Queue поддерживает (BerkeleyDb).

Там своя специфика будет, я думаю. В итоге придётся лепить что-то пригодное из того, что для этого не предназначалось и собирать грабли. Вполне может выйти так, что времени сил и нервов на это уйдет больше, чем на велик.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906067
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Не рассматривал базы данных т.к. это оверхед и сортировки по дате всегда тормознутые.
а зачем в очереди fifo сортировка?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906068
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
BerkeleyDb

викиПоследняя версия 6.0.20 (10 июня 2013 года)
Я не хочу тебя расстраивать, но по-моему оно уже сдохло. Я за велик.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906070
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Почему мне не подошли MQ системы? Ну по той причине что от MQ мне нужен был только персистенс.
а сказал что сортировка миллирда
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906071
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Я за велик
а сортировка?))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906074
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton
Очередь большая.
тут копай. Транзакции слишком длинные?

У нас нет транзакций. Просто загрузка. Ее можно трактовать как транзакцию а можно и нет.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906075
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как ты организуешь очередь FIFO в базе данных?

Организовать то без проблем, но ты понимаешь что жесткое FIFO это жесткая сериализация?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906076
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ее можно трактовать
я это и сделал.
Смотри, если очередь не выгребать, то НИКАКОЙ ПАМЯТИ не хватит. Очевидно?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906077
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
а сортировка?))

А зачем? Там же просто fifo с двумя метками.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906078
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
А зачем? Там же просто fifo с двумя метками.
он хочет. Я спросил зачем?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906079
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Зачем?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906080
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster

mayton
Либо в коробочное решение которое вроде как Queue поддерживает (BerkeleyDb).

Там своя специфика будет, я думаю. В итоге придётся лепить что-то пригодное из того, что для этого не предназначалось и собирать грабли. Вполне может выйти так, что времени сил и нервов на это уйдет больше, чем на велик.

Да там своя специфика. Вот - картинка есть на эту тему.
https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/berkeley-db-datasheet-132390.pdf
Это говоря грубо. Вообще не SQL-dbms. Это встраиваемая система которая поддерживает B+Tree, Hastable, Queue-организованные
табличные структуры. Диалект SQL там вообще не основной API. Как в key-value. Он может поддерживаться но как дополнительная
услуга. Чтоб не было так страшно на нее смотреть невооруженным глазом.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906082
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton
Ее можно трактовать
я это и сделал.
Смотри, если очередь не выгребать, то НИКАКОЙ ПАМЯТИ не хватит. Очевидно?

Да. У нас процесс продюсер будет работать быстрее чем консюмер. Но консюмер за 1 сутки
должен подобрать то что продюссер наформировал за 1 час.

(Это всё цифры приближенные. Не цепляйтесь к ним.)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906083
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton,

Зачем?

Зачем что? Сортировка? Низачем.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906086
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Это говоря грубо. Вообще не SQL-dbms. Это встраиваемая система которая поддерживает B+Tree, Hastable, Queue-организованные
табличные структуры.

Ну вот зачем всё это тащить ради одного queue? Вместо этого же можно весело провести время за изобретением велика!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906093
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(пожимая плечами)

Ну давай. Начинай. Но инженерный подход в общем случае заключается в поиске и отборе существующих
инструментов. И потом уже собственно в разработке того чего нет.

Тыж не создаёшь свой собственный драйвер для принтера если надо 1 страничку распечатать?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906096
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp
пропущено...
я это и сделал.
Смотри, если очередь не выгребать, то НИКАКОЙ ПАМЯТИ не хватит. Очевидно?

Да. У нас процесс продюсер будет работать быстрее чем консюмер. Но консюмер за 1 сутки
должен подобрать то что продюссер наформировал за 1 час.

(Это всё цифры приближенные. Не цепляйтесь к ним.)

Можно абстрактно, можно считать память как сишники.
Винда сбрасывает в своп когда память кончается?
Почему MQ системы не подходят если ОЧЕРЕДЬ?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906097
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тыж не создаёшь свой собственный драйвер для принтера если надо 1 страничку распечатать?

Ну, когда у меня был матричник я писал какой-то скрипт, который именно это и делал. Работало так: я выделял текст, нажимал шорткат и оно печаталось. Таким же образом делал "драйвер" для com сканера штрихкодов, ибо всё существующие было дерьмовыми дельфиподелками.
mayton
Ну давай. Начинай

Всё, поздно. Я уже домой собираюсь. Можешь сделать ТЗ и описать подробнее что надо и под какие нагрузки, пока я доберусь до компа.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906099
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Почему MQ системы не подходят если ОЧЕРЕДЬ?

MQ это не столько про очередь, сколько про доставку сообщений.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906103
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
PetroNotC Sharp
Почему MQ системы не подходят если ОЧЕРЕДЬ?

MQ это не столько про очередь, сколько про доставку сообщений.
допустим 50 на 50.
Разве не как в спринг.... Бери то что надо?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906106
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Тыж не создаёшь свой собственный драйвер для принтера если надо 1 страничку распечатать?

Ну, когда у меня был матричник я писал какой-то скрипт, который именно это и делал. Работало так: я выделял текст, нажимал шорткат и оно печаталось. Таким же образом делал "драйвер" для com сканера штрихкодов, ибо всё существующие было дерьмовыми дельфиподелками.

Ты - страшный человек Даже не могу представить как ты по работе проблемы решаешь. Всё - сам кодишь.
Процент повторного использования кода для тебя ... наверное равен нулю ?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906109
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MQ системы обычно связаны с поднятием сетевых сервисов. У меня пока все локально. 1 процесс все делает.
Поэтому поднимать еще MQ не вижу смысла.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906110
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
MQ системы обычно связаны с поднятием сетевых сервисов. У меня пока все локально. 1 процесс все делает.
Поэтому поднимать еще MQ не вижу смысла.
понял.
А как с сортировкой? Либо fifo либо сортировка.
Выбирай.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужна мне никакая сортировка от слова вообще. Мне нужен FIFO.

Но очередей будет несколько. И нужна очистка в случае всяких repeat-логик.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906122
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster

Всё, поздно. Я уже домой собираюсь. Можешь сделать ТЗ и описать подробнее что надо и под какие нагрузки, пока я доберусь до компа.

Нет никакого ТЗ. Есть пока только идея. Сейчас процессы синхронизированы и работают медленно.
Я хочу их разнести в конвейер очередей.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906123
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Но очередей будет несколько.
если на разные машины, то это и есть решение с памятью. Так?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906125
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я хочу их разнести в конвейер очередей.
конвейер не ускоряет. Балансировщик ускоряет
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906126
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

По сути тебе нужно хранение сущностей на диске в виде двусвязного списка, таких инструментов не знаю, может в графовую БД запихать?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906128
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, если делать велосипед, я бы делал что нибудь простое. Типа Circle Ring Buffer на диске. Chunk фиксированного размера (байтов 30-60). Большие записи разбивать на несколько chunk'ов и просто писать последовательно.

Структура хранения будет тривиальная. Поскольку FIFO и Circle Ring Buffer то не будет фрагментации и все общение с диском исключительно последовательное - максимальная производительность на любом жетком диске.

Объем кода для полноценной реализации, думаю пара сотен строк в максимуме. Недостаток и одновременно достоинство, место для хранилище нужно выделять заранее. Для пользовательского софта это был бы недостаток, для серверного достоинство.

mayton
Не нужна мне никакая сортировка от слова вообще. Мне нужен FIFO.

Но очередей будет несколько. И нужна очистка в случае всяких repeat-логик.

Про очистку не понял.

Вообще, interface из первого поста на Queue совершенно не похож. Где Вы видели такие Queue, я вообще не понимаю ))) и что данный интерфейс должен делать - тоже )))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906131
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
По сути тебе нужно хранение сущностей на диске в виде двусвязного списка , таких инструментов не знаю, может в графовую БД запихать?

Зачем?
1. Банальный файл на диске и логика Circle Ring Buffer.
в конец пишем, из начала читаем.

2. Если нужно удаление и random доступ к содержимому, то банальная табличка например в SQL Lite
id, data
Низ и верх / начало и конец / head tail FIFO очереди банально храним в самом классе. Т.ч. никаких сортировок или min/max не требуется

Насколько я помню. Табличка в SQL Lite это физически Key-Value, NoSQL структура. Т.ч. даже даже дополнительный индекс primary key в случае SQL Lite будет не нужен )))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906132
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
А я и не знал про редактирование))))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
mayton,

По сути тебе нужно хранение сущностей на диске в виде двусвязного списка, таких инструментов не знаю, может в графовую БД запихать?

Зачем графовую? У меня нет графов?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906135
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

Вообще, interface из первого поста на Queue совершенно не похож. Где Вы видели такие Queue, я вообще не понимаю ))) и что данный интерфейс должен делать - тоже )))

Ну... это так. Для затравки. Для старта дискуссии. Надож с чегото начать. Да он не совместим с стандартными очередями.
Ну и фиг с ним.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906136
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Leonid Kudryavtsev,
А я и не знал про редактирование))))

Можно тактично послать собеседника а потом быстринько зачистить.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906137
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
mayton,
По сути тебе нужно хранение сущностей на диске в виде двусвязного списка, таких инструментов не знаю, может в графовую БД запихать?

Хранение сущностей любого размера друг за другом. Без пропусков)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906139
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp
Leonid Kudryavtsev,
А я и не знал про редактирование))))

Можно тактично послать собеседника а потом быстринько зачистить.
Пока не на ком пробовать)))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906144
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Реализация кольцевого есть где?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906159
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что там "реализовывать" ?

Можно конечно поискать в google.com, но честно говоря, интерес представляет не реализация (дабы ее любой школьник за час закодировать может), а оптимизация под конкретные условия работы

а тут нужно знать эти самые условия, особой конкретики в топике нет

из интересных обсуждений, использование circle ring buffer'а на диске для видеопередачи (видеокамера продюсер + пара видеоплееров консьюмеры)
https://stackoverflow.com/questions/45869793/c-circular-buffer-using-large-disk-file/45870483
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906192
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В теме с буферизацией видосов речь идет о записях фиксированного размера.
Их легче поддерживать. Как арифметику указателей в С++
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906273
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для вариативного размера... я пока придумал писать sequence из файлов. Типа

Код: plaintext
1.
2.
q0001.dat
q0002.dat



И по кругу их использовать. Каждый файл приближенно до 128Мб. Что диск рационально утилизировать.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906276
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Каждый файл приближенно до 128Мб. Что диск рационально утилизировать.
для этого ещё надо размер кластера сделать максимальным - 128 к или больше.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906280
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я беру за основу идею что мне не нужен 1 месседж ка единица использования.
Если при размере 1-4k средняя длина месседжа будет 2 к то в 128 Мегабайтном
куске у меня лежит фрагмент FIFO порядка 65 тысяч месседжей.

Это меня вполне устраивает. Все равно чтение и запись будет крупным потоком.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906324
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В теме с буферизацией видосов речь идет о записях фиксированного размера.
Их легче поддерживать. Как арифметику указателей в С++

Mayton, фиксированные <=> не фиксированные - двадцать строчек кода

В момент записи: Разбиваем на сhunk'и и пишем в FIFO Circle Ring Buffer, у последней записи ставим признак последняя
В момент чтения:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
StringBuilder sb = new...; 
while ( true ) {
  MyFixedSizeElement tmp = myFileCircleRingBuffer.poll();
  sb.append( tmp.chunk );
  if ( tmp.послядняя ) {
    return sb.toString();
  }
}



Для вариативного размера... я пока придумал писать sequence из файлов. Типа

Чем сиквенс из 10 файлов по 128 Mb лучше одного файла в 1.2 Gb - мне не понятно
Чем он помогает при записях разной длина - мне так же не понятно.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, предлагай свои варианты.

Базовый проткол остаётся тот-же самый. Но добавим метод poll. И несколько очередей (несколько экземпляров Q)
и бросание исключений и ошибки статусов для каждой команды.

Код: javascript
1.
2.
3.
4.
5.
interface Q {
   add(Object entity);
   Object poll();
   purge();
}
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906328
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В теме с буферизацией видосов....

тут скорее вопрос:
1. допустимо и нужно ли "накапливать" входящие пакеты в памяти перед записью на диск?
2. какая максимальная задержка по времени допустима?
(пакет пришел и пауза... буфер не заполнен, нужен сброс по таймеру)
3. требование к надежности
(нужно ли и когда жестко flush'ить)
4. Так же не очень понятно, где хранить head - tail позицию. Вроде же они должны быть синхронезированы у читателя и писателя (когда очередь не заполнена и читатели ждут новых данных). Если на диске, когда их flush'ить
С последним пунктом не уверен, нужно думать, а что бы начинать думать, по хорошему нужно начинать кодить )))

совершенно не понятно, что Вы имели в виду под "удалением"
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906329
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
mayton
В теме с буферизацией видосов....

тут скорее вопрос:
1. допустимо и нужно ли "накапливать" входящие пакеты в памяти перед записью на диск?

Да.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906331
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

4. Так же не очень понятно, где хранить head - tail позицию. Вроде же они должны быть синхронезированы у читателя и писателя (когда очередь не заполнена и читатели ждут новых данных). Если на диске, когда их flush'ить
С последним пунктом не уверен, нужно думать, а что бы начинать думать, по хорошему нужно начинать кодить )))

Это самый интересный и сложный вопрос. Я как раз думаю что форум придумает пропозицию.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906332
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

3. требование к надежности
(нужно ли и когда жестко flush'ить)

Нет жесткого требования. Если вы будете флашить через каждые 3 секунды с последнего event то я не против.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906333
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

совершенно не понятно, что Вы имели в виду под "удалением"

Очистка? Ну... как вариант обнаружен баг и очередь надо сбросить.
Или в кластере java-приложений насмерть помер один из nodes и чтобы
ребаланс евентов сработал - надо просто рестаровать бизнес процессы
в новом окружении очередей. Старые данные что скопились в очередях
уже ценности не представляют. Их можно убить.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906378
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пятничный креатив: сбрасывайте сообщения в Lucene (если нужно легкое рукоблудное решение с нулевым администрированием) или в Elastic (тут с администрированием, зато и с кластеризацией) с индексацией по времени
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906396
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом приближении
Многопоток не проверял и не делал
Проверок не делал
Гитхабом не заморачивался )))
Буферизацию не делал. Флегда флушится.

пришлось сделать свою реализацию FileOutputStream, FileInputStream трогать не стал )))


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Расширяет FileOutputStream. При close не закрывает поток, а просто перепозиционируется в начало
 */
public class MyFileOutputStream extends FileOutputStream {
    public MyFileOutputStream( String fname ) throws FileNotFoundException {
        super(fname);
    }

    @Override
    public void close() throws IOException {
        this.getChannel().position( 0 );
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
import java.io.*;

/**
 * Класс представляет из себя Circle Ring Buffer для работы с файлом
 */
public class FileRing {
    int maxFileSize;
    int reserv;
    String fname;
    long readPos;
    long flushedWritePos;
    long flushedFileSize;
    FileInputStream inStream;
    MyFileOutputStream outStream;
    ObjectInputStream in;
    ObjectOutputStream out;
    DataInput inData;
    DataOutput outData;
    FileRing(String fname, int maxFileSize, int reserv ) throws IOException {
        this.fname = fname;
        this.maxFileSize = maxFileSize;
        this.reserv = reserv;
        outStream = new MyFileOutputStream( fname );
        out = new  ObjectOutputStream( outStream );
        inStream = new FileInputStream( fname );
        in = new ObjectInputStream( inStream );
    }

    public void add(Object entity) throws IOException {
        out.writeObject( entity );
        this.flush();
    }

    /* Достигли конца очереди при записи, переходим в начало */
    private void writeEndOfCircle() throws IOException {
        //
System.out.println( "writeEndOfCircle!" );
        this.flushedFileSize = this.flushedWritePos;
System.out.println( "this.flushedFileSize="+this.flushedFileSize );
        // позиционируемся в начало
        // "Как-бы" закрываем поток и пересоздаем его
        this.out.close();
        this.out = new ObjectOutputStream( this.outStream );
    }

    public void flush() throws IOException {
        out.flush();
        this.flushedWritePos = outStream.getChannel().position();
System.out.println( "flushedWritePos="+flushedWritePos );
        // достигли конец файла
        if ( this.flushedWritePos > (this.maxFileSize-this.reserv) ) {
            this.writeEndOfCircle();
        }
    }

    public boolean isEmpty() {
        return this.readPos == this.flushedWritePos;
    }

    public Object poll() throws IOException, ClassNotFoundException {
        Object o;
        // Достигли конца файла
        if ( this.readPos==this.flushedFileSize ) {
            System.out.println( "end of file at read. readPos="+ this.readPos );
            // Достигли конца файла, переоткрываем его
            this.in.close();
            this.inStream = new FileInputStream( this.fname );
            this.in = new ObjectInputStream( this.inStream );
            this.readPos = 0;
        }
        if (isEmpty()) {
           return null;
        }
        o = in.readObject();
        this.readPos = this.inStream.getChannel().position();
System.out.println( "readPos="+readPos );
        return o;
    }

    public void purge() {
        this.readPos = this.flushedWritePos = 0;
    }
}



простейший тест на запись и чтение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
import java.io.IOException;

public class Test {
    public static void  main( String argv[] ) throws IOException, ClassNotFoundException {
        FileRing r;
        r = new FileRing( "my.ring", 200, 40 );
        // Простое тестирование записи/чтения
        for ( int i = 0; i<10; i++ ) {
            String s= "My String "+i+".";
            r.add( s );
        }
        for ( int i = 0; i<10; i++ ) {
            String s = (String) r.poll();
            System.out.println( s );
        }
        // На очередных строчках, будет переход через границу буффера
        for ( int i = 0; i<10; i++ ) {
            String s= "My String "+i+".";
            r.add( s );
        }
        for ( int i = 0; i<10; i++ ) {
            String s = (String) r.poll();
            System.out.println( s );
        }

    }
}


...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906418
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
И как его закрыть тогда?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906419
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
Leonid Kudryavtsev,
И как его закрыть тогда?

Что если вдруг эксепшен? Ну так себе идея..
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906434
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё memcached и rocksdb.

https://db-engines.com/en/system/Memcached;RocksDB;SwayDB

Хорошего вам дня!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906460
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Спасибо. Попробуем.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906599
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. Кое что не юзается. Убрал.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import java.io.*;

/**
 * Класс представляет из себя Circle Ring Buffer для работы с файлом
 */
public class FileRing {
    int maxFileSize;
    int reserv;
    String fname;
    long readPos;
    long flushedWritePos;
    long flushedFileSize;
    FileInputStream inStream;
    MyFileOutputStream outStream;
    ObjectInputStream in;
    ObjectOutputStream out;
    DataInput inData;
    DataOutput outData;
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906614
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо еще потестить в 2 потока. Один добавляет. Другой poll-ит.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906689
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Надо еще потестить в 2 потока. Один добавляет. Другой poll-ит.

я никак не могу придумать, как сделать проверку на переполнение буфера

если ее не делать - то все просто, но как-то хочется, что бы если пишешь больше размера буфера и читалка не успевает - был бы эксепшен
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906697
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте отложим пока. Это не бизнес-кейс.

Главное что больше чем heap положили в голову очереди - уже хорошо.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906776
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменил Object на Serializable. Изменил тест пока на синхронное отрабатывание сначала продюсера а потом потребителя.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
package mayton;

import org.apache.log4j.Logger;

import java.io.Serializable;
import java.util.Random;

public class Test {

    static Logger logger = org.apache.log4j.Logger.getLogger(Test.class);

    public Test() throws Exception {
        final FileRing r = new FileRing("out/my.ring", 16_384, 40);

        Thread procuder = new Thread(() -> {
            Random random = new Random();
            try {
                for (int i = 0; i < 20_000; i++) {
                    r.add(Integer.valueOf(i));
                }
                logger.info("Successfully wrote 10_000 Integer objects");
            } catch (Exception e) {
                logger.error(e);
            }
        });

        procuder.start();

        procuder.join();

        Thread consumer = new Thread(() -> {
            try {
                int sum = 0;
                for (int i = 0; i < 20_000; i++) {
                    Serializable object = r.poll();
                    sum += (Integer) object;
                }
                logger.info("Successfully read 20_000 Integer objects with sum = " + sum);
            } catch (Exception e) {
                logger.error("Exception during consumer loop", e);
            }
        });

        consumer.start();

        consumer.join();
    }

    public static void main(String argv[]) throws Exception {

        new Test();

    }

}


Код: java
1.
2.
3.
4.
5.
2019-12-22 22:42:10,512 [Thread-0] INFO  mayton.Test - Successfully wrote 10_000 Integer objects
2019-12-22 22:42:10,526 [Thread-1] ERROR mayton.Test - Exception during consumer loop
java.lang.NullPointerException
	at mayton.Test.lambda$new$1(Test.java:36)
	at java.base/java.lang.Thread.run(Thread.java:834)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906815
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Даже не могу представить как ты по работе проблемы решаешь. Всё - сам кодишь.

Ну почему всё. Либы для оракла и раббита я не велосипедил
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39906816
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Честно говоря, если делать велосипед, я бы делал что нибудь простое. Типа Circle Ring Buffer на диске. Chunk фиксированного размера (байтов 30-60). Большие записи разбивать на несколько chunk'ов и просто писать последовательно.

Структура хранения будет тривиальная. Поскольку FIFO и Circle Ring Buffer то не будет фрагментации и все общение с диском исключительно последовательное - максимальная производительность на любом жетком диске.

Да, думал, пришел к тому же самому. Разделители - не нужно, запись кусками с метками (принято/отправленно/кусок/заголовок) настраиваемого размера.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907281
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Заменил Object на Serializable

AFAIK:
Serializable - тупое и медленное г...но
Externalizable - rulezzzzz
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907294
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
mayton
Заменил Object на Serializable

AFAIK:
Serializable - тупое и медленное г...но
Externalizable - rulezzzzz

Согласен.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Leonid Kudryavtsev
Честно говоря, если делать велосипед, я бы делал что нибудь простое. Типа Circle Ring Buffer на диске. Chunk фиксированного размера (байтов 30-60). Большие записи разбивать на несколько chunk'ов и просто писать последовательно.

Структура хранения будет тривиальная. Поскольку FIFO и Circle Ring Buffer то не будет фрагментации и все общение с диском исключительно последовательное - максимальная производительность на любом жетком диске.

Да, думал, пришел к тому же самому. Разделители - не нужно, запись кусками с метками (принято/отправленно/кусок/заголовок) настраиваемого размера.

Если использовать мой подход
Код: java
1.
2.
file0001.dat
file0002.dat


то кольцо делать не нужно. Файловая система предоставляет нам все что нужно.

А чтоб readPos не догонял writePos их надо синхронизировать через Приложение.
Как вариант - два Atomic счетчика.

Long указателя должно хватить на десятилетия. Инстанс приложения столько не живет
обычно.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907444
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использованные файлы - удалять нахер. Сразу-же как только readPos их вычитал.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907512
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создание файла - AFAIK крайне дорогая операция + дергание головок.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен. Игры с аллокацией тоже надо посчитать. Но этот вариант меня тоже устраивает т.к. он - простой.
А перформансных инцедентов пока у нас нет т.к. нет самого софта и нет данных.

Вариант с вращением данных в одном файле - тоже ОК. Только я еще хотел дописать либо Externalize поддержку
либо какой-нибудь Cryo.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907628
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Создание файла - AFAIK крайне дорогая операция + дергание головок.

если памяти не хватает, что ещё остаётся?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907629
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
Leonid Kudryavtsev
Создание файла - AFAIK крайне дорогая операция + дергание головок.

если памяти не хватает, что ещё остаётся?
один файл с разделами. Или бд
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907630
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за файл с разделами?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907631
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД я отверг как избыточное. Кроме того... только Berkeley заявяет о поддержке очереди FIFO
как нативной структуре данных. И встроенные движки в MQ-брокеры но... API которых мне неизвестен.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907638
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
что за файл с разделами?

1 файл с миллионом классов в формате - имя класса, сам класс в байтах.
2 файл индексный, где позиции начала классов.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907650
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
БД я отверг как избыточное. Кроме того... только Berkeley заявяет о поддержке очереди FIFO
как нативной структуре данных.

Не модет быть, чтобы оракл был хуже))
https://docs.oracle.com/database/121/ADQUE/aq_intro.htm#ADQUE2431
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907659
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
полудух
что за файл с разделами?

1 файл с миллионом классов в формате - имя класса, сам класс в байтах.
2 файл индексный, где позиции начала классов.

в смысле vector<User> ?
или как оно там в Яве...?
да пофиг, как такой вектор сохранить в файл в C++?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907668
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,



У меня есть шанс построить копеечное решение а ты меня толкаешь в дорогие и лицензированные?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907676
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp,



У меня есть шанс построить копеечное решение а ты меня толкаешь в дорогие и лицензированные?


Так есть готовое решение.

Хорошего вам дня!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907681
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov
mayton
PetroNotC Sharp,



У меня есть шанс построить копеечное решение а ты меня толкаешь в дорогие и лицензированные?


Так есть готовое решение.

Хорошего вам дня!

SayDb мы отбросили.
Memcached - это по определению In-memory dbms, поэтому не подходит.
RocksDb я помню. Хорошая штука от Фейсбука. Я где-то проводил сравнение ее с LevelDb.
Надо еще раз почитать про нее.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907711
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
PetroNotC Sharp
пропущено...

1 файл с миллионом классов в формате - имя класса, сам класс в байтах.
2 файл индексный, где позиции начала классов.

в смысле vector<User> ?
или как оно там в Яве...?
да пофиг, как такой вектор сохранить в файл в C++?

В java смотрят крупнее на задачи.
Неважно в каком контейнере приходят миллионы объектов. В коллекции/векторе/массиве/связанные веревкой.
На диск мы УПОРЯДОЧЕННО сбрасываем только объекты. Без контейнера.
То есть User, Puser, Muser, Мышка, Паровоз,...
Вот можно создать 5 файлов, а можно один и можно парочку.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907713
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Создание файла - AFAIK крайне дорогая операция + дергание головок

В 2к20 уже можно пользоваться ssd.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907714
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Serializable - тупое и медленное г...но
Externalizable - rulezzzzz

эскобар.жпг
По сравнению с си/плюсами - всё это 3-х колёсные велики без педалей. Тут единственный вменяемый способ - кастить структуру сразу из void*, всё остальное - дико медленно.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907717
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
да пофиг, как такой вектор сохранить в файл в C++?

Элементарно. Кастишь всё в char* да сохраняешь.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907759
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
полудух
да пофиг, как такой вектор сохранить в файл в C++?

Элементарно. Кастишь всё в char* да сохраняешь.

Может так?
int x = testvalue;
fwrite(&x, 1, sizeof(int), fp);
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907883
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
полудух
да пофиг, как такой вектор сохранить в файл в C++?

Элементарно. Кастишь всё в char* да сохраняешь.

а как структуру скастить в чар?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39907981
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Leonid Kudryavtsev
Создание файла - AFAIK крайне дорогая операция + дергание головок

В 2к20 уже можно пользоваться ssd.

Уже ранее говорил:

Даже для SSD, тарифы Amazon'а считают IOPS'ы и их тарифицируют/режут_скорость

Т.ч. даже SSD не значит, что из IO-подсистемы можно устраивать помойку. Это все равно скажется или на производительности (в случае механики) или на деньгах (в случае с Amazon'ом)

IMHO & AFAIK
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908069
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
crutchmaster
пропущено...

Элементарно. Кастишь всё в char* да сохраняешь.

а как структуру скастить в чар?

уже сам нашёл (внизу)
авторПри сложном строении классов или активном участии указателей в классах объекты часто сериализуют. Я сериализовать ничего не умею, поэтому и показать, как такое вытворять — не могу.
а про это кто чего может сказать?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Leonid Kudryavtsev
Serializable - тупое и медленное г...но
Externalizable - rulezzzzz

эскобар.жпг
По сравнению с си/плюсами - всё это 3-х колёсные велики без педалей. Тут единственный вменяемый способ - кастить структуру сразу из void*, всё остальное - дико медленно.

Здесь С++ не нужен потому что у нас весь стек технологий на базе Java-8. Это требование нашего
драгоценного кастомера. Который платит нам деньги. Которые мы тоже нежно любим.

Спор о том что будет быстрее кастинг void* или еще что-то это спор о наносекундах.
У нас идет речь о величинах порядка 1-мс. Сетевые события.

Поэтому не вижу особого смысла развивать идею подобного спора.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908250
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
У нас идет речь о величинах порядка 1-мс.

Умножь эти 1 мс на количество запросов получится очень даже жирно.

mayton
Спор о том что будет быстрее кастинг void* или еще что-то это спор о наносекундах.

Это вопрос о том, что эффективнее, возможно, в тысячи раз.

mayton
Здесь С++ не нужен потому что у нас весь стек технологий на базе Java-8.

Ну, если железо покроет оверхед, то ок, хотя я наслышан, что в ынтерпрайзе не гнушаются не то, что сями в жабке, а даже засовывать в этот си асм вставки.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908251
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
а про это кто чего может сказать?

Ну так же как и на жабкином Externalizable делают каждому метод, который выкидывает char* всего, что нужно. Потом всё это собирают и переписывают. На выходе получается тупое копирование кусков памяти с со всех экземпляров классов и минимумом оверхеда в отличии от жабки, которая будет заниматься хрен пойми чем.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908252
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Может так?

Так int - не struct, и там еще надо по указателям будет бегать с контейнерами.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908263
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
PetroNotC Sharp
Может так?

Так int - не struct, и там еще надо по указателям будет бегать с контейнерами.
дак и приведи пример структуры с int, string, myClass.
Не все наверно поняли твою строчку и идею класса в байтовый поток.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908271
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//псевдокод
struct test {
    int id;
    string str;
    myClass c;
    ostream& operator<<(ostream& out, const test& t) {
        os << id << str << c;
        return os;
    }
}


Как-то так.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908274
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Согласен.
А что если в ТЗ сказать что структура классов заранее неизвестна?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908278
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
А что если в ТЗ сказать что структура классов заранее неизвестна?

Неизвестна когда? Во время компиляции? Да и хрен бы с ней, можно и в рантайме классов наделать, главное, чтобы их все можно было в поток потом спустить.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908280
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Я понимаю, что ты клонишь к тому, что получится та же самая ява. Ну да. Тогда там будет велоява без ненужного оверхеда.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908284
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Угу.
Как раз на обход всех полей класса время уходит.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908300
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Как раз на обход всех полей класса время уходит.

Ну, как бы если там всё динамическое, то можно вообще херачить всё в char*, а потом кастить нужные куски этого буфера по известным метаданным.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908306
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
PetroNotC Sharp
Как раз на обход всех полей класса время уходит.

Ну, как бы если там всё динамическое, то можно вообще херачить всё в char*, а потом кастить нужные куски этого буфера по известным метаданным.

В java вроде так:
Код: java
1.
2.
3.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat")))
Person p = new Person("Sam", 33, 178, true);
oos.writeObject(p);


А ты опять сослался на звездочку указатель примера которого так и не привел.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908307
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Указатели на память становятся плохим тоном в программировании.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908319
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
А ты опять сослался на звездочку указатель примера которого так и не привел.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Object {
    Metadata meta;
    char* buffer;
    int length;
    int* getInt(int nfield) {
        if (meta.isIntField(nfield)) {
            return (int*)buffer + meta.getOffset(nfield);
        }
        return NULL;
    }
    //...
}


Что-то такое.

PetroNotC Sharp
Указатели на память становятся плохим тоном в программировании.

Да они всегда считались чем-то стрёмным, но что ты интересного в жизни сделаешь без void* и зачем вообще плюсы и сишечка нужны без void*?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908352
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Попытка #5
Где тут твой класс Object?
22048154
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908371
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут:
User, Puser, Muser, Мышка, Паровоз,...
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908380
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
crutchmaster,
Согласен.
А что если в ТЗ сказать что структура классов заранее неизвестна?

видимо некий dump-class получает список указателей на члены, которые надо сохранить...
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908381
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
crutchmaster,
Указатели на память становятся плохим тоном в программировании.

По разному. В ассемблере - это каждодневная рутина.
В бизнес-программинге - это вечный источник ошибок и предмет ненависти. Особенно когда
кодер старшей категории делает code-review своих младших коллег.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908391
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Я про ЯП высокого уровня. Не про ассемблер.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908393
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,
Ну дак RTTI же.
А в java зовут рефлексия.
Мы же это не будем тут изобретать?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908394
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Дык там нет твоего класса в качестве базового.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908521
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
полудух,
Ну дак RTTI же.
А в java зовут рефлексия.
Мы же это не будем тут изобретать?

значит где-то должна быть либа, которая идеально сохраняет объекты на диск и потом восстанавливает их
(в т.ч. и сложные иерархии классов с указателями)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908531
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
У нас идет речь о величинах порядка 1-мс.

Умножь эти 1 мс на количество запросов получится очень даже жирно.

mayton
Спор о том что будет быстрее кастинг void* или еще что-то это спор о наносекундах.

Это вопрос о том, что эффективнее, возможно, в тысячи раз.

mayton
Здесь С++ не нужен потому что у нас весь стек технологий на базе Java-8.

Ну, если железо покроет оверхед, то ок, хотя я наслышан, что в ынтерпрайзе не гнушаются не то, что сями в жабке, а даже засовывать в этот си асм вставки.

(разводя руками)
Совершенству нет предела. Пишите вашу очередь на С++. Но у нас - бизнес код. И его много. И интеракция
с С++ на Java в рамках одного процесса мне слабо представляется. В крайнем случае - это сетевой сокет
но это уже движение в сторону MQ систем. А я этого всячески избегаю.

Поэтому какой-то процесс на Асме который делает очень быстрые вставки в файл мне ровным счетом ничего
не дает из-за сложностей интеграции.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908547
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
PetroNotC Sharp
полудух,
Ну дак RTTI же.
А в java зовут рефлексия.
Мы же это не будем тут изобретать?

значит где-то должна быть либа, которая идеально сохраняет объекты на диск и потом восстанавливает их
(в т.ч. и сложные иерархии классов с указателями)

Уже есть на java. Выше 2 строчки дал.
Со сложными связями нигде нет либы. Это везде руками.
Ну, у автора message идут простейшие. Без связей между собой.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908597
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какой вариант лучше? И для каких случаев
struct User
{
Phone* ph;
Phone ph;
};
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908600
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
а какой вариант лучше? И для каких случаев
struct User
{
Phone* ph;
Phone ph;
};

В java эти варианты сделали одним. Чтобы не мучались.
А в плюсах почему то невозможно сделать null во втором варианте. То есть если я Phone рожаю на кнрпку во время работы программы я обязан делать первый вариант.
Асвторой, если в конструкторе класса main.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908602
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покурите как управление памятью сделано в Rust. Там - интереснее.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908607
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Покурите как управление памятью сделано в Rust. Там - интереснее.
дак у меня в плюсах топик на эту тему.
Как я изумился невозможности жить без звездочки))).
Как только ставил без, то конструктор класса автоматом стартовал меня не спрашивая))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908610
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, нету у тебя ничего в плюсах про Rust.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908618
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
В java эти варианты сделали одним. Чтобы не мучались.

ну да, ну да... знаем мы эти "не мучались"
в PHP вон сделали int универсальный, "чтоб не мучались"... он и int, и short, и uint, и ulong
а по итогу int в PHP весит 40 байт!!
и это в PHP7, а в PHP5 было 76 байт!
про массив (который одновременно и map, и tuple, и array) в PHP вообще молчу... как сказал Александреску - "самая идиотская придумка of all time"
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908622
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Про указатели а не rust
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908625
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,
PHP это ты далеко сравнил. У них ООП то недавно.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908630
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ООП не имеет отношения к звёздочкам или интам
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Про указатели а не rust

Кинь ссылку. А то нахожу все не то.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908637
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,
Тогда с 1С сравнивай. Никто не против.
Я могу сравнить с дельфи, шарп и явой.
Не я же вводил умные указатели.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908638
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Ок
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908640
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется тема умных указателей будет вечной потому что нет теоретической базы.
Как в реляционной алгебре. Нужен аппарат. Который просто должен ответить на вопрос
нужено ли значение указателя или нет.

А пока нет и будут делать полу-умные. Полу-авторматические. Почти-умные. Смарт-умные.
И так-далее.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908641
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp
mayton,
Про указатели а не rust

Кинь ссылку. А то нахожу все не то.

21897977
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908654
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton
пропущено...

Кинь ссылку. А то нахожу все не то.

21897977

Блин! И тема не твоя. И не про указатели!
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908658
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Конкретнее маэстро.
Тема моя, так как в те времена за мной гонялись люди в черном))) из шарп.
Шифровался.
#онижедети
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я про petrav говорю. Тыж не Петров? Верно?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908674
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Лучше цитируй. И я всё расскажу) (с)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908684
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очевидно это он, мыло одинаковое
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908687
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Форум каскадный апдейт поддерживает?)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39908700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Форум каскадный апдейт поддерживает?)

Каскадный бан.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909311
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
проверь юз кейс пожалуйста
- в топике нажимаем Ответить
- форум перемещает вверх и вставляет в окошко JS имя с запятой
- нажимаем у другого ответить
- форум перемещает вверх и вставляет в окошко JS ВТОРОЕ имя с запятой СТИРАЯ прошлое.
То есть цитировать несколько раз невозможно.
Есть такой глюк? Это сайт?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909336
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
Это не ко мне чувак. Я такой же пользователь обобщенного UI как и все.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909339
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Дык тебя и просят как обычного юзверя проверить)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909436
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, я не очень понимаю какой баг ты воспроизводишь?

Да при режиме цитирования если ты еще раз нажмешь Ответить на другого мембера - предыдущая форма ответа
обнуляется. Нормальное на мой взгляд поведение.

К цитированию не имеет отношения. Цитирование можешь сам добить рекурсивными тегами quote.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909448
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Баг потому что было не так.
Старый текст не стирался а добавлялся.
Второй юз кейс это выделить текс и нажать Цитировать.
У меня не выделенное добавляется а ВЕСЬ ПОСТ.
У тебя так?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909449
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Ты правда сам теги ставишь?
Видно сишника издалека))
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты знаешь. Все эти нововведения форума меня настолько мало волнуют. Вобщем.. я за 15 лет сидения
в скруле давно уже не интересуюсь. Мне важен контент а не оболочка. Вот щас они langing пейджу
поменяли на какое-то говно. И зачем?

Вобщем я - консервативен в выборе UI. Мне даже телеграм не заходит как замена С++ и Java форуму.
А знаешь почему? Там нет возможности нормально исходник оформить. Тудаже до кассы твиттеры. Фейсбуки.
Вацабы и Вайберы. Говно-говняцкое.

И вообще. Лучшее - враг хорошего и ничего нового под солнцем люди не сделали. Всё есть - бесконечное
пережёвывание идей 20-го века.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909451
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Баг потому что было не так.
Старый текст не стирался а добавлялся.
Второй юз кейс это выделить текс и нажать Цитировать.
У меня не выделенное добавляется а ВЕСЬ ПОСТ.
У тебя так?

всё ок
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909452
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,
Странно. У меня на двух независимых компах сломалось)). Надо включить отладчик JS.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909461
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в профиле есть настройки форума, а там есть "Включить "быстрый" ответ и цитирование"
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909550
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
в профиле есть настройки форума, а там есть "Включить "быстрый" ответ и цитирование"

Точно. Спасибо.
Кстати очень странный параметр. Насколько понял, он по умолчанию при создании аккаунта не включается. И второе, зачем она выведена для юзверя? Какой прок от режима "выкл быстрое цитирование"?
Плюсов вроде никаких).
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909609
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще сам себе ссылку кидаю. Kafka. Persistence.

https://kafka.apache.org/documentation/#persistence
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909663
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Еще сам себе ссылку кидаю. Kafka. Persistence.

https://kafka.apache.org/documentation/#persistence


http://swaydb.io/?language=java/

Легковеснее.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909858
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909869
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov
mayton
Еще сам себе ссылку кидаю. Kafka. Persistence.

https://kafka.apache.org/documentation/#persistence


http://swaydb.io/?language=java/

Легковеснее.

Прости пожалуйста. Но где те самые весы на которые можно положить эти две технологии чтоб взвесить?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39909871
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Вот за это - спасибос большой. Посмотрю.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910430
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый год был бурный. Но топик я не забыл. Я помню. Актуальность есть.

Промежуточный итог. На рассмотрении следующие системы.

- Berkeley Db (точно есть)
- KahaDB (есть но хер доступишся до API запрятано внутри)
- Leonid's Queue (хорошо но мне надо попроще. С ротацией файлов).
- RocksDB (посмотреть есть ли поддержка)
- Tape ( https://github.com/square/tape) посмотреть что это как работает и какие есть лимиты.

Как дойдут руки я попробую сделать бенчмарк хотя-бы для 2-3 их них и выбрать одну либу.

Прочие системы которые я отбросил не содержали нативной поддержки FIDO(Queue) как
дисковой структуры данных или нигде не деларировали ее.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910657
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем всегда на диск писать всю очередь? Ну выросла очередь в памяти, пусть её ОС на диск своппит, когда припрёт. Кольцевой буфер теоретически правильный подход, но для ССД это хороший способ портить диски, впрочем, как и куча отдельных файлов. Почему, кстати, ext4, а не xfs или что-то другое? И да, куски меньше 4к при записи всё равно смысла не имеют.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ext4 это просто дефолтная амазонская ec2 конфигурация.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910660
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу свопа. Опять же... Мы влезем в глубокий технический спор на тему как выбирать Xmx для известной конфигурации памяти.

Я думаю тут выбор очевиден. А дисковая очередь - это просто моя перестраховки. Тем более что я знаю характер и род нагрузки. И он не совпадает с Heap. Он редкий. И шквальный.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910668
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То-есть у вас вся нагрузка взрывная и заморачиваться с трешхолдом писать в память/писать на диск нет смысла?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть смысл писать на диск.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910834
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тест QueueFile - в мьютексах не шарю
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class TestQueueFile {

    private final int CNT_SD = 10_000;//cnt send data peer thread

    private final int CNT_TX = 2;//cnt writer
    private final int CNT_RX = 2;//cnt reader

    private final Object LOCK = new Object();

    private QueueFile queueFile = null;

    private int ttl = 0;

    public TestQueueFile() {

        try {
            //new File("./testFile.txt").deleteOnExit();

            queueFile = new QueueFile.Builder(new File("./testFile.txt")).
                    zero(true).
                    forceLegacy(true).
                    build();

            for (int i = 0; i < CNT_TX; i++) {
                executorService.submit(new Writer());
            }

            while (writerCnt < 1) {
                Thread.sleep(1);
            }

            for (int i = 0; i < CNT_RX; i++) {
                executorService.submit(new Reader());
            }

            executorService.shutdown();
            executorService.awaitTermination(30, TimeUnit.MINUTES);

            System.out.println(queueFile.toString());
            System.out.println("Total: " + ttl);

            queueFile.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new TestQueueFile();
    }

    private ExecutorService executorService = Executors.newFixedThreadPool(CNT_RX + CNT_TX);

    private int readerCnt = 0, writerCnt = 0;

    private class Writer implements Runnable {

        @Override
        public void run() {
            synchronized (LOCK) {
                writerCnt++;
            }
            Thread.currentThread().setName("writer" + writerCnt);
            System.out.printf("%10s started.\n", Thread.currentThread().getName());
            try {
                for (int i = 0; i < CNT_SD; i++) {
                    synchronized (LOCK) {
                        queueFile.add((i + " " + Thread.currentThread().getName() + " text\n").getBytes());
                    }
                    Thread.sleep(1);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            synchronized (LOCK) {
                writerCnt--;
            }

            System.out.printf("%10s finished!\n", Thread.currentThread().getName());
        }
    }

    private class Reader implements Runnable {

        @Override
        public void run() {
            synchronized (LOCK) {
                readerCnt++;
            }
            Thread.currentThread().setName("reader" + readerCnt);
            System.out.printf("%10s started.\n", Thread.currentThread().getName());
            int cnt0 = 0, cnt1 = 0;
            try {
                boolean empty = false;
                /*while*/
                for (int i = 0; i < CNT_SD * 1_000_000/*:D*/ && (writerCnt > 0 || !empty); i++) {

                    synchronized (LOCK) {
                        empty = queueFile.isEmpty();
                        if (!empty) {
                            cnt1++;
                            String s = new String(queueFile.pool());
                            //int x = Integer.parseInt(s.split(" ")[0].trim());
                            //System.out.println(Thread.currentThread().getName() + " " + s);
                        }
                    }
                    //Thread.sleep((long) (Math.random() * 100));
                    if (empty) {
                        cnt0++;
                        Thread.sleep(2);
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            synchronized (LOCK) {
                ttl += cnt1;
                readerCnt--;
            }
            System.out.printf("%10s finished! idle =%4s, data =%4s\n", Thread.currentThread().getName(), cnt0, cnt1);
        }
    }
}

QueueFile - покоцал
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
760.
761.
762.
763.
764.
765.
766.
767.
768.
769.
770.
771.
772.
773.
774.
775.
776.
777.
778.
779.
780.
781.
782.
783.
784.
785.
786.
787.
788.
789.
790.
791.
792.
793.
794.
795.
796.
797.
798.
799.
800.
801.
802.
803.
804.
805.
806.
807.
808.
809.
810.
811.
812.
813.
814.
815.
816.
817.
818.
819.
820.
821.
822.
823.
824.
825.
826.
827.
828.
829.
830.
831.
832.
833.
834.
835.
836.
837.
838.
839.
840.
841.
842.
843.
844.
845.
846.
847.
848.
849.
850.
851.
852.
853.
854.
855.
856.
857.
858.
859.
860.
861.
862.
863.
864.
865.
866.
867.
868.
869.
870.
871.
872.
873.
874.
875.
876.
877.
878.
879.
880.
881.
882.
883.
884.
885.
886.
887.
888.
889.
890.
891.
892.
893.
894.
895.
896.
897.
898.
899.
900.
901.
902.
903.
904.
905.
906.
907.
908.
909.
910.
911.
912.
913.
914.
915.
916.
917.
918.
919.
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Copyright (C) 2010 Square, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
//import javax.annotation.Nullable;

import static java.lang.Math.min;

/**
 * A reliable, efficient, file-based, FIFO queue. Additions and removals are
 * O(1). All operations are atomic. Writes are synchronous; data will be written
 * to disk before an operation returns. The underlying file is structured to
 * survive process and even system crashes. If an I/O exception is thrown during
 * a mutating change, the change is aborted. It is safe to continue to use a
 * {@code QueueFile} instance after an exception.
 *
 * <p>
 * <strong>Note that this implementation is not synchronized.</strong>
 *
 * <p>
 * In a traditional queue, the remove operation returns an element. In this
 * queue, {@link #peek} and {@link #remove} are used in conjunction. Use
 * {@code peek} to retrieve the first element, and then {@code remove} to remove
 * it after successful processing. If the system crashes after {@code peek} and
 * during processing, the element will remain in the queue, to be processed when
 * the system restarts.
 *
 * <p>
 * <strong>NOTE:</strong> The current implementation is built for file systems
 * that support atomic segment writes (like YAFFS). Most conventional file
 * systems don't support this; if the power goes out while writing a segment,
 * the segment will contain garbage and the file will be corrupt. We'll add
 * journaling support so this class can be used with more file systems later.
 *
 * Construct instances with {@link Builder}.
 *
 * @author Bob Lee (bob@squareup.com)
 */
public final class QueueFile implements Closeable, Iterable<byte[]> {

    /**
     * Leading bit set to 1 indicating a versioned header and the version of 1.
     */
    private static final int VERSIONED_HEADER = 0x80000001;

    /**
     * Initial file size in bytes.
     */
    //static final int INITIAL_LENGTH = 4096; // one file system block
    static final int INITIAL_LENGTH = 4096; // one file system block

    /**
     * A block of nothing to write over old data.
     */
    private static final byte[] ZEROES = new byte[INITIAL_LENGTH];

    /**
     * The underlying file. Uses a ring buffer to store entries. Designed so
     * that a modification isn't committed or visible until we write the header.
     * The header is much smaller than a segment. So long as the underlying file
     * system supports atomic segment writes, changes to the queue are atomic.
     * Storing the file length ensures we can recover from a failed expansion
     * (i.e. if setting the file length succeeds but the process dies before the
     * data can be copied).
     * <p>
     * This implementation supports two versions of the on-disk format.
     * <pre>
     * Format:
     *   16-32 bytes      Header
     *   ...              Data
     *
     * Header (32 bytes):
     *   1 bit            Versioned indicator [0 = legacy (see "Legacy Header"), 1 = versioned]
     *   31 bits          Version, always 1
     *   8 bytes          File length
     *   4 bytes          Element count
     *   8 bytes          Head element position
     *   8 bytes          Tail element position
     *
     * Legacy Header (16 bytes):
     *   1 bit            Legacy indicator, always 0 (see "Header")
     *   31 bits          File length
     *   4 bytes          Element count
     *   4 bytes          Head element position
     *   4 bytes          Tail element position
     *
     * Element:
     *   4 bytes          Data length
     *   ...              Data
     * </pre>
     */
    final RandomAccessFile raf;

    /**
     * Keep file around for error reporting.
     */
    final File file;

    /**
     * True when using the versioned header format. Otherwise use the legacy
     * format.
     */
    final boolean versioned;

    /**
     * The header length in bytes: 16 or 32.
     */
    final int headerLength;

    /**
     * Cached file length. Always a power of 2.
     */
    long fileLength;

    /**
     * Number of elements.
     */
    private int elementCount;

    /**
     * Pointer to first (or eldest) element.
     */
    private Element first;

    /**
     * Pointer to last (or newest) element.
     */
    private Element last;

    /**
     * In-memory buffer. Big enough to hold the header.
     */
    private final byte[] buffer = new byte[32];

    /**
     * The number of times this file has been structurally modified — it is
     * incremented during {@link #remove(int)} and
     * {@link #add(byte[], int, int)}. Used by {@link ElementIterator} to guard
     * against concurrent modification.
     */
    private int modCount = 0;

    /**
     * When true, removing an element will also overwrite data with zero bytes.
     */
    private final boolean zero;

    private boolean closed;

    private static RandomAccessFile initializeFromFile(File file, boolean forceLegacy)
            throws IOException {
        if (!file.exists()) {
            // Use a temp file so we don't leave a partially-initialized file.
            File tempFile = new File(file.getPath() + ".tmp");
            try (RandomAccessFile raf = open(tempFile)) {
                raf.setLength(INITIAL_LENGTH);

                raf.seek(0);
                if (forceLegacy) {
                    raf.writeInt(INITIAL_LENGTH);
                } else {
                    raf.writeInt(VERSIONED_HEADER);
                    raf.writeLong(INITIAL_LENGTH);
                }

            }

            // A rename is atomic.
            if (!tempFile.renameTo(file)) {
                throw new IOException("Rename failed!");
            }
        }

        return open(file);
    }

    /**
     * Opens a random access file that writes synchronously.
     */
    private static RandomAccessFile open(File file) throws FileNotFoundException {
        return new RandomAccessFile(file, "rwd");
    }

    QueueFile(File file, RandomAccessFile raf, boolean zero, boolean forceLegacy) throws IOException {
        this.file = file;
        this.raf = raf;
        this.zero = zero;

        raf.seek(0);
        raf.readFully(buffer);

        versioned = !forceLegacy && (buffer[0] & 0x80) != 0;
        long firstOffset;
        long lastOffset;
        if (versioned) {
            headerLength = 32;

            int version = readInt(buffer, 0) & 0x7FFFFFFF;
            if (version != 1) {
                throw new IOException(
                        "Unable to read version " + version + " format. Supported versions are 1 and legacy.");
            }
            fileLength = readLong(buffer, 4);
            elementCount = readInt(buffer, 12);
            firstOffset = readLong(buffer, 16);
            lastOffset = readLong(buffer, 24);
        } else {
            headerLength = 16;

            fileLength = readInt(buffer, 0);
            elementCount = readInt(buffer, 4);
            firstOffset = readInt(buffer, 8);
            lastOffset = readInt(buffer, 12);
        }

        if (fileLength > raf.length()) {
            throw new IOException(
                    "File is truncated. Expected length: " + fileLength + ", Actual length: " + raf.length());
        } else if (fileLength <= headerLength) {
            throw new IOException(
                    "File is corrupt; length stored in header (" + fileLength + ") is invalid.");
        }

        first = readElement(firstOffset);
        last = readElement(lastOffset);
    }

    /**
     * Stores an {@code int} in the {@code byte[]}. The behavior is equivalent
     * to calling {@link RandomAccessFile#writeInt}.
     */
    private static void writeInt(byte[] buffer, int offset, int value) {
        buffer[offset] = (byte) (value >> 24);
        buffer[offset + 1] = (byte) (value >> 16);
        buffer[offset + 2] = (byte) (value >> 8);
        buffer[offset + 3] = (byte) value;
    }

    /**
     * Reads an {@code int} from the {@code byte[]}.
     */
    private static int readInt(byte[] buffer, int offset) {
        return ((buffer[offset] & 0xff) << 24)
                + ((buffer[offset + 1] & 0xff) << 16)
                + ((buffer[offset + 2] & 0xff) << 8)
                + (buffer[offset + 3] & 0xff);
    }

    /**
     * Stores an {@code long} in the {@code byte[]}. The behavior is equivalent
     * to calling {@link RandomAccessFile#writeLong}.
     */
    private static void writeLong(byte[] buffer, int offset, long value) {
        buffer[offset] = (byte) (value >> 56);
        buffer[offset + 1] = (byte) (value >> 48);
        buffer[offset + 2] = (byte) (value >> 40);
        buffer[offset + 3] = (byte) (value >> 32);
        buffer[offset + 4] = (byte) (value >> 24);
        buffer[offset + 5] = (byte) (value >> 16);
        buffer[offset + 6] = (byte) (value >> 8);
        buffer[offset + 7] = (byte) value;
    }

    /**
     * Reads an {@code long} from the {@code byte[]}.
     */
    private static long readLong(byte[] buffer, int offset) {
        return ((buffer[offset] & 0xffL) << 56)
                + ((buffer[offset + 1] & 0xffL) << 48)
                + ((buffer[offset + 2] & 0xffL) << 40)
                + ((buffer[offset + 3] & 0xffL) << 32)
                + ((buffer[offset + 4] & 0xffL) << 24)
                + ((buffer[offset + 5] & 0xffL) << 16)
                + ((buffer[offset + 6] & 0xffL) << 8)
                + (buffer[offset + 7] & 0xffL);
    }

    /**
     * Writes header atomically. The arguments contain the updated values. The
     * class member fields should not have changed yet. This only updates the
     * state in the file. It's up to the caller to update the class member
     * variables *after* this call succeeds. Assumes segment writes are atomic
     * in the underlying file system.
     */
    private void writeHeader(long fileLength, int elementCount, long firstPosition, long lastPosition) throws IOException {

        raf.seek(0);
        if (versioned) {

            writeInt(buffer, 0, VERSIONED_HEADER);
            writeLong(buffer, 4, fileLength);
            writeInt(buffer, 12, elementCount);
            writeLong(buffer, 16, firstPosition);
            writeLong(buffer, 24, lastPosition);

            raf.write(buffer, 0, 32);
            return;
        }

        // Legacy queue header.
        writeInt(buffer, 0, (int) fileLength); // Signed, so leading bit is always 0 aka legacy.
        writeInt(buffer, 4, elementCount);
        writeInt(buffer, 8, (int) firstPosition);
        writeInt(buffer, 12, (int) lastPosition);

        raf.write(buffer, 0, 16);

    }

    private Element readElement(long position) throws IOException {
        if (position == 0) {
            return Element.NULL;
        }
        ringRead(position, buffer, 0, Element.HEADER_LENGTH);
        int length = readInt(buffer, 0);
        return new Element(position, length);
    }

    /**
     * Wraps the position if it exceeds the end of the file.
     */
    private long wrapPosition(long position) {
        return position < fileLength ? position
                : headerLength + position - fileLength;
    }

    /**
     * Writes count bytes from buffer to position in file. Automatically wraps
     * write if position is past the end of the file or if buffer overlaps it.
     *
     * @param position in file to write to
     * @param buffer to write from
     * @param count # of bytes to write
     */
    private void ringWrite(long position, byte[] buffer, int offset, int count) throws IOException {
        position = wrapPosition(position);
        if (position + count <= fileLength) {
            raf.seek(position);
            raf.write(buffer, offset, count);
        } else {
            // The write overlaps the EOF.
            // # of bytes to write before the EOF. Guaranteed to be less than Integer.MAX_VALUE.
            int beforeEof = (int) (fileLength - position);
            raf.seek(position);
            raf.write(buffer, offset, beforeEof);
            raf.seek(headerLength);
            raf.write(buffer, offset + beforeEof, count - beforeEof);
        }
    }

    private void ringErase(long position, long length) throws IOException {
        while (length > 0) {
            int chunk = (int) min(length, ZEROES.length);
            ringWrite(position, ZEROES, 0, chunk);
            length -= chunk;
            position += chunk;
        }
    }

    /**
     * Reads count bytes into buffer from file. Wraps if necessary.
     *
     * @param position in file to read from
     * @param buffer to read into
     * @param count # of bytes to read
     */
    private void ringRead(long position, byte[] buffer, int offset, int count) throws IOException {
        position = wrapPosition(position);
        if (position + count <= fileLength) {
            raf.seek(position);
            raf.readFully(buffer, offset, count);
        } else {
            // The read overlaps the EOF.
            // # of bytes to read before the EOF. Guaranteed to be less than Integer.MAX_VALUE.
            int beforeEof = (int) (fileLength - position);
            raf.seek(position);
            raf.readFully(buffer, offset, beforeEof);
            raf.seek(headerLength);
            raf.readFully(buffer, offset + beforeEof, count - beforeEof);
        }
    }

    /**
     * Adds an element to the end of the queue.
     *
     * @param data to copy bytes from
     */
    public void add(byte[] data) throws IOException {
        add(data, 0, data.length);
    }

    /**
     * Adds an element to the end of the queue.
     *
     * @param data to copy bytes from
     * @param offset to start from in buffer
     * @param count number of bytes to copy
     * @throws IndexOutOfBoundsException if {@code offset < 0} or
     * {@code count < 0}, or if {@code
     * offset + count} is bigger than the length of {@code buffer}.
     */
    public void add(byte[] data, int offset, int count) throws IOException {
        if (data == null) {
            throw new NullPointerException("data == null");
        }
        if ((offset | count) < 0 || count > data.length - offset) {
            throw new IndexOutOfBoundsException();
        }
        if (closed) {
            throw new IllegalStateException("closed");
        }

        expandIfNecessary(count);

        // Insert a new element after the current last element.
        boolean wasEmpty = isEmpty();
        long position = wasEmpty ? headerLength
                : wrapPosition(last.position + Element.HEADER_LENGTH + last.length);
        Element newLast = new Element(position, count);

        // Write length.
        writeInt(buffer, 0, count);
        ringWrite(newLast.position, buffer, 0, Element.HEADER_LENGTH);

        // Write data.
        ringWrite(newLast.position + Element.HEADER_LENGTH, data, offset, count);

        // Commit the addition. If wasEmpty, first == last.
        long firstPosition = wasEmpty ? newLast.position : first.position;

        writeHeader(fileLength, elementCount + 1, firstPosition, newLast.position);
        last = newLast;
        elementCount++;
        modCount++;
        if (wasEmpty) {
            first = last; // first element
        }
    }

    private long usedBytes() {
        if (elementCount == 0) {
            return headerLength;
        }

        if (last.position >= first.position) {
            // Contiguous queue.
            return (last.position - first.position) // all but last entry
                    + Element.HEADER_LENGTH + last.length // last entry
                    + headerLength;
        } else {
            // tail < head. The queue wraps.
            return last.position // buffer front + header
                    + Element.HEADER_LENGTH + last.length // last entry
                    + fileLength - first.position;        // buffer end
        }
    }

    private long remainingBytes() {
        return fileLength - usedBytes();
    }

    /**
     * Returns true if this queue contains no entries.
     */
    public boolean isEmpty() {
        return elementCount == 0;
    }

    /**
     * If necessary, expands the file to accommodate an additional element of
     * the given length.
     *
     * @param dataLength length of data being added
     */
    private void expandIfNecessary(long dataLength) throws IOException {
        long elementLength = Element.HEADER_LENGTH + dataLength;
        long remainingBytes = remainingBytes();
        if (remainingBytes >= elementLength) {
            return;
        }

        // Expand.
        long previousLength = fileLength;
        long newLength;
        // Double the length until we can fit the new data.
        do {
            remainingBytes += previousLength;
            newLength = previousLength << 1;
            previousLength = newLength;
        } while (remainingBytes < elementLength);

        setLength(newLength);

        // Calculate the position of the tail end of the data in the ring buffer
        long endOfLastElement = wrapPosition(last.position + Element.HEADER_LENGTH + last.length);
        long count = 0;
        // If the buffer is split, we need to make it contiguous
        if (endOfLastElement <= first.position) {
            FileChannel channel = raf.getChannel();
            channel.position(fileLength); // destination position
            count = endOfLastElement - headerLength;
            if (channel.transferTo(headerLength, count, channel) != count) {
                throw new AssertionError("Copied insufficient number of bytes!");
            }
        }

        // Commit the expansion.
        if (last.position < first.position) {
            long newLastPosition = fileLength + last.position - headerLength;
            writeHeader(newLength, elementCount, first.position, newLastPosition);
            last = new Element(newLastPosition, last.length);
        } else {
            writeHeader(newLength, elementCount, first.position, last.position);
        }

        fileLength = newLength;

        if (zero) {
            ringErase(headerLength, count);
        }
    }

    /**
     * Sets the length of the file.
     */
    private void setLength(long newLength) throws IOException {
        // Set new file length (considered metadata) and sync it to storage.
        raf.setLength(newLength);
        raf.getChannel().force(true);
    }

    /**
     * Reads the eldest element. Returns null if the queue is empty.
     */
    public byte[] peek() throws IOException {
        if (closed) {
            throw new IllegalStateException("closed");
        }
        if (isEmpty()) {
            return null;
        }
        int length = first.length;
        byte[] data = new byte[length];
        ringRead(first.position + Element.HEADER_LENGTH, data, 0, length);
        return data;
    }

    public byte[] pool() throws IOException {
        byte[] data = peek();
        remove();
        return data;
    }

    /**
     * Returns an iterator over elements in this QueueFile.
     *
     * <p>
     * The iterator disallows modifications to be made to the QueueFile during
     * iteration. Removing elements from the head of the QueueFile is permitted
     * during iteration using {@link Iterator#remove()}.
     *
     * <p>
     * The iterator may throw an unchecked {@link IOException} during
     * {@link Iterator#next()} or {@link Iterator#remove()}.
     */
    @Override
    public Iterator<byte[]> iterator() {
        return new ElementIterator();
    }

    private final class ElementIterator implements Iterator<byte[]> {

        /**
         * Index of element to be returned by subsequent call to next.
         */
        int nextElementIndex = 0;

        /**
         * Position of element to be returned by subsequent call to next.
         */
        private long nextElementPosition = first.position;

        /**
         * The {@link #modCount} value that the iterator believes that the
         * backing QueueFile should have. If this expectation is violated, the
         * iterator has detected concurrent modification.
         */
        int expectedModCount = modCount;

        private ElementIterator() {
        }

        private void checkForComodification() {
            if (modCount != expectedModCount) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        public boolean hasNext() {
            if (closed) {
                throw new IllegalStateException("closed");
            }
            checkForComodification();
            return nextElementIndex != elementCount;
        }

        @Override
        public byte[] next() {
            if (closed) {
                throw new IllegalStateException("closed");
            }
            checkForComodification();
            if (isEmpty()) {
                throw new NoSuchElementException();
            }
            if (nextElementIndex >= elementCount) {
                throw new NoSuchElementException();
            }

            try {
                // Read the current element.
                Element current = readElement(nextElementPosition);
                byte[] buffer = new byte[current.length];
                nextElementPosition = wrapPosition(current.position + Element.HEADER_LENGTH);
                ringRead(nextElementPosition, buffer, 0, current.length);

                // Update the pointer to the next element.
                nextElementPosition
                        = wrapPosition(current.position + Element.HEADER_LENGTH + current.length);
                nextElementIndex++;

                // Return the read element.
                return buffer;
            } catch (IOException e) {
                throw QueueFile.<Error>getSneakyThrowable(e);
            }
        }

        @Override
        public void remove() {
            checkForComodification();

            if (isEmpty()) {
                throw new NoSuchElementException();
            }
            if (nextElementIndex != 1) {
                throw new UnsupportedOperationException("Removal is only permitted from the head.");
            }

            try {
                QueueFile.this.remove();
            } catch (IOException e) {
                throw QueueFile.<Error>getSneakyThrowable(e);
            }

            expectedModCount = modCount;
            nextElementIndex--;
        }
    }

    /**
     * Returns the number of elements in this queue.
     */
    public int size() {
        return elementCount;
    }

    /**
     * Removes the eldest element.
     *
     * @throws NoSuchElementException if the queue is empty
     */
    public void remove() throws IOException {
        remove(1);
    }

    /**
     * Removes the eldest {@code n} elements.
     *
     * @throws NoSuchElementException if the queue is empty
     */
    public void remove(int n) throws IOException {
        if (n < 0) {
            throw new IllegalArgumentException("Cannot remove negative (" + n + ") number of elements.");
        }
        if (n == 0) {
            return;
        }
        if (n == elementCount) {
            clear();
            return;
        }
        if (isEmpty()) {
            throw new NoSuchElementException();
        }
        if (n > elementCount) {
            throw new IllegalArgumentException(
                    "Cannot remove more elements (" + n + ") than present in queue (" + elementCount + ").");
        }

        long eraseStartPosition = first.position;
        long eraseTotalLength = 0;

        // Read the position and length of the new first element.
        long newFirstPosition = first.position;
        int newFirstLength = first.length;
        for (int i = 0; i < n; i++) {
            eraseTotalLength += Element.HEADER_LENGTH + newFirstLength;
            newFirstPosition = wrapPosition(newFirstPosition + Element.HEADER_LENGTH + newFirstLength);
            ringRead(newFirstPosition, buffer, 0, Element.HEADER_LENGTH);
            newFirstLength = readInt(buffer, 0);
        }

        // Commit the header.
        writeHeader(fileLength, elementCount - n, newFirstPosition, last.position);
        elementCount -= n;
        modCount++;
        first = new Element(newFirstPosition, newFirstLength);

        if (zero) {
            ringErase(eraseStartPosition, eraseTotalLength);
        }
    }

    /**
     * Clears this queue. Truncates the file to the initial size.
     */
    public void clear() throws IOException {
        if (closed) {
            throw new IllegalStateException("closed");
        }

        // Commit the header.
        writeHeader(INITIAL_LENGTH, 0, 0, 0);

        if (zero) {
            // Zero out data.
            raf.seek(headerLength);
            raf.write(ZEROES, 0, INITIAL_LENGTH - headerLength);
        }

        elementCount = 0;
        first = Element.NULL;
        last = Element.NULL;
        if (fileLength > INITIAL_LENGTH) {
            setLength(INITIAL_LENGTH);
        }
        fileLength = INITIAL_LENGTH;
        modCount++;
    }

    /**
     * The underlying {@link File} backing this queue.
     */
    public File file() {
        return file;
    }

    @Override
    public void close() throws IOException {
        try (raf) {
            writeHeader(fileLength, elementCount, first.position, last.position);
            closed = true;
        }
    }

    @Override
    public String toString() {
        try {
            writeHeader(fileLength, elementCount, first.position, last.position);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return "QueueFile{"
                + "file=" + file
                + ", zero=" + zero
                + ", versioned=" + versioned
                + ", length=" + fileLength
                + ", size=" + elementCount
                + ", first=" + first
                + ", last=" + last
                + '}';
    }

    /**
     * A pointer to an element.
     */
    static class Element {

        static final Element NULL = new Element(0, 0);

        /**
         * Length of element header in bytes.
         */
        static final int HEADER_LENGTH = 4;

        /**
         * Position in file.
         */
        final long position;

        /**
         * The length of the data.
         */
        final int length;

        /**
         * Constructs a new element.
         *
         * @param position within file
         * @param length of data
         */
        Element(long position, int length) {
            this.position = position;
            this.length = length;
        }

        @Override
        public String toString() {
            return getClass().getSimpleName()
                    + "[position=" + position
                    + ", length=" + length
                    + "]";
        }
    }

    /**
     * Fluent API for creating {@link QueueFile} instances.
     */
    public static final class Builder {

        final File file;
        boolean zero = true;
        boolean forceLegacy = false;

        /**
         * Start constructing a new queue backed by the given file.
         */
        public Builder(File file) {
            if (file == null) {
                throw new NullPointerException("file == null");
            }
            this.file = file;
        }

        /**
         * When true, removing an element will also overwrite data with zero
         * bytes.
         *
         * @return
         */
        public Builder zero(boolean zero) {
            this.zero = zero;
            return this;
        }

        /**
         * When true, only the legacy (Tape 1.x) format will be used.
         */
        public Builder forceLegacy(boolean forceLegacy) {
            this.forceLegacy = forceLegacy;
            return this;
        }

        /**
         * Constructs a new queue backed by the given builder. Only one instance
         * should access a given file at a time.
         */
        public QueueFile build() throws IOException {
            RandomAccessFile raf = initializeFromFile(file, forceLegacy);
            QueueFile qf = null;
            try {
                qf = new QueueFile(file, raf, zero, forceLegacy);
                return qf;
            } finally {
                if (qf == null) {
                    raf.close();
                }
            }
        }
    }

    /**
     * Use this to throw checked exceptions from iterator methods that do not
     * declare that they throw checked exceptions.
     */
    @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
    static <T extends Throwable> T getSneakyThrowable(Throwable t) throws T {
        throw (T) t;
    }
}

...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910845
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Nevsky, ого тут букв. А есть ссылка на гитхаб?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910851
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, git чего?

я на коленке)

это давал - https://github.com/square/tape

от туда выдрал - QueueFile.java
покоцал - покоцаный файл/*код*/ под спойлером (-аннотации Private, +pool)
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910854
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Nevsky, спасибо конешно. Но мне такие простыни кода в браузер вобщем-то не надо.

Я вообще листинги больше чем 20 строк не воспринимаю. Неужели ты думаешь что я их щас
быстро прочту и осознаю и решу что это рабчий материал?

Я либо смотрю структурно. Либо по юзкейсам. По описаниям. По документации.

Мне в данном топике исходники не нужны. Я и сам много всего пишу и могу наводнить этот форум
своими сорцами. Мне нужны какие-то гарантии что это работает.

Ты сам проверил что это работает?

Понимаешь? Чтоб я не тратил своё время на изучение чуждого кода. Поэтому и мне были интересны
в первую очередь BerkeleyDb, Kaha(ApacheMQ) потому-что это 100% рабочий материал.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910855
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, даже не знаю, что, Вам, ответить ....
код рабочий, готовый тест ... многопоточный ...
проверял ...
95,1%

.... непонятки указал - мьютексы.

слабое звено - читающий блокирует пишущего, пишущий - читающего ...
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910856
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Я потрачу на ваш сорц 15 минут времени. Но если что-то не склеится - я отставлю в сторону.

Вы не против?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39910857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До сорца Леонида руки так и не дошли. Последнее что я там видел - NPE и моё пожелание упростить
интеракцию файловой системы до нескольких файлов. Без повторного использования.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39911067
Бумбараш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему для задачи очереди не использовать очереди? я чо то так и не понял
простите, что такое неординарное предложение

кафки, рабиты и вот это всё
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39911070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
MQ системы обычно связаны с поднятием сетевых сервисов. У меня пока все локально. 1 процесс все делает.
Поэтому поднимать еще MQ не вижу смысла.
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39911079
Бумбараш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так их локально можно поставить

базы данные тоже обычно связаны с поднятием сетевых сервисов
ну и вообще
обычно любой %program_name% связан с поднятием сетевых сервисов

или стоит цель zaebatsya, но написать что-нибудь своё?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39911080
Бумбараш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бумбараш
ну так их локально можно поставить

базы данных тоже обычно связаны с поднятием сетевых сервисов
ну и вообще
обычно любой %program_name% связан с поднятием сетевых сервисов

или стоит цель zaebatsya, но написать что-нибудь своё?
...
Рейтинг: 0 / 0
Queue с поддержкой сериализации на диск.
    #39911081
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечу в течение недели. Пока нет времени.
...
Рейтинг: 0 / 0
200 сообщений из 200, показаны все 8 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Queue с поддержкой сериализации на диск.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]