|
|
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Всем привет. Известно что в файл пишут несколько нитей. Подскажите, как к гарантировано писать в конец файла. Перестановка указателя в конец файла не помогает, все равно часть данных затирается. Метод ран: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2013, 22:43:51 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaИзвестно что в файл пишут несколько нитей. Подскажите, как к гарантировано писать в конец файла. Перестановка указателя в конец файла не помогает, все равно часть данных затирается. Во-первых, нужно вынести за пределы метода run() (и класса Runnable) инициализацию переменной RandomAccessFile raf . Ну, и во-вторых, синхронизировать потоки. Например: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. P.S. http://www.skipy.ru/technics/synchronization.html#monitors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 05:13:44 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
выделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 12:38:46 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
jdroidвыделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис Ага. Вот такой сервис: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 12:53:29 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
думаю лучше будет написать сервис с правильной синхронизацией операций записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:14:53 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Usman http://www.skipy.ru/technics/synchronization.html#monitors По вашей ссылке: если кто-то использует ресурс и захватил монитор для обеспечения единоличного доступа, то другой, желающий использовать тот же ресурс, должен подождать освобождения монитора То есть насколько я понял, выходит обычная однопоточная запись в файл, а мне нужно другое. jdroidвыделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис У меня и так было выделено: Код: java 1. 2. 3. 4. Проблема актуальна :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:17:41 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Так в чем проблема то? Вам уже дали корректный ответ: необходимо синхронизировать операцию записи, что бы одновременно мог писать только один поток. Других решений здесь нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:20:23 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
cdtyjvТак в чем проблема то? Вам уже дали корректный ответ: необходимо синхронизировать операцию записи, что бы одновременно мог писать только один поток. Других решений здесь нет. Мне нужно писать в несколько потоков и 100% такое решение есть, потому что я видел рабочую программу. Осталось дело за малым - написать такую же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:25:20 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaТо есть насколько я понял, выходит обычная однопоточная запись в файл, а мне нужно другое. Какое, нафиг, "другое"? Логически подумай как два потока могут одновременно записать в конец файла, если запись изменяет позицию конца? В любом случае нужна очередь. Если нужно всё это дело жутко заопимтимизировать, то можно взять AtomicInteger в котором трекать длину файла при каждой записи. Если запись производится в конец, то AtomicInteger инкрементируется на длину добавляемого блока. В качестве конца файла все потоки должны использовать этот AtomicInteger. Но такая оптимизация, ИМХО, особого смысла не имеет. Запись в файл намного медленнее чем блогикровки или другая синхронизация. Особенно если там HDD . Возможно если там SDD или виртуальный диск, и то не факт. Там ещё файловая система с операционкой много чего могут заблокировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:28:11 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaМне нужно писать в несколько потоков Именно в конец файла? sharmankaи 100% такое решение есть 100% есть готовое или 100% можно реализовать? sharmankaпотому что я видел рабочую программу. Откуда вы знаете как она устроена? sharmankaОсталось дело за малым - написать такую же. Осталось дело за малым синхронизировать запись в конце файла - не важно каким способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:30:09 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМне нужно писать в несколько потоков Именно в конец файла? Это не уточняется, я думаю можно писать в любое место, главное чтобы предыдущие записи не затирались. Blazkowicz100% есть готовое или 100% можно реализовать? готовое BlazkowiczОткуда вы знаете как она устроена? автор сказал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:33:26 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
суть в том, что при rw как мне кажется, никуда кроме как в конец, запистаь не получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:34:29 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaсуть в том, что при rw как мне кажется, никуда кроме как в конец, запистаь не получится Вам "кажется"? Других объективных предпосылок нет? Запись с "добавлением" не путаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:37:24 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЗапись с "добавлением" не путаете? Со "вставкой" то есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:37:42 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
писать в файл одновременно невозможно (особенности устройства жесткого диска) если нужна производительность потоков на запись, сервис копирует сообщения себе в очередь и отдает управление потоку, а фоновым потоком пишет из очереди в файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:41:59 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
jdroidписать в файл одновременно невозможно (особенности устройства жесткого диска) А кто сказал что файловая система на жестком диске? jdroidесли нужна производительность потоков на запись, сервис копирует сообщения себе в очередь и отдает управление потоку, а фоновым потоком пишет из очереди в файл. Не понятно чего автор темы желает. HDD и SSD можно легко полностью нагрузить одним единственным потоком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:45:16 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Blazkowicz100% есть готовое или 100% можно реализовать? готовое BlazkowiczОткуда вы знаете как она устроена? автор сказал[/quot] BlazkowiczА кто сказал что файловая система на жестком диске? опишите, плиз, архитектуру системы вашего автора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:53:57 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaЭто не уточняется, я думаю можно писать в любое место, главное чтобы предыдущие записи не затирались. Это уже будет нетранзакционная база данных. Что такое "предыдущие записи". Откуда поток может знать что кто-то уже что-то написал? sharmankaавтор сказал То есть он 100% прав. И вы 100% правильно поняли что он имел ввиду. А мы тут все вас обманываем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 13:57:27 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBlazkowiczЗапись с "добавлением" не путаете? Со "вставкой" то есть. Хорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт. Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:00:59 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто уже будет нетранзакционная база данных. Что такое "предыдущие записи". Откуда поток может знать что кто-то уже что-то написал? Наверное вызвав метод raf.length() и сравнив его с каким-то "предыдущим" значением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:03:13 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaBlazkowiczпропущено... Со "вставкой" то есть. Хорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт. Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу? используйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:07:59 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
jdroidиспользуйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед хочу разобраться, поэтому нужен свой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:09:51 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaХорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт. Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу? Ну, так я это и предлагал выше - завести потокобезопасный счетчик конца файла для вычисления позиции записи каждого потока. Но какой в этом грандиозный смысл, если код тупо усложняется, а производительность диска никак не увеличивается? А в случае HDD даже уменьшается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:11:16 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaхочу разобраться, поэтому нужен свой :) Уже все разжевали подробно чтобы разобратся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:11:50 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНу, так я это и предлагал выше - завести потокобезопасный счетчик конца файла для вычисления позиции записи каждого потока. Но какой в этом грандиозный смысл, если код тупо усложняется, а производительность диска никак не увеличивается? А в случае HDD даже уменьшается. Давайте считать, что у меня академический интерес :) Вопрос по этому счетчику - как, куда, каким образом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:15:14 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankajdroidиспользуйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед хочу разобраться, поэтому нужен свой :) лисапет только на картинке просто устроен, а когда начинаеш его собирать самостоятельно всплывает огромная масса нюансов кстати log4j опенсорсный, он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:17:33 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaДавайте считать, что у меня академический интерес :) Дык с постановкой задачи определитесь. "Чтобы не перезатиралось" это что-то очень сумбурное и расплывчатое. Конечная цель какая? Написать тест убедится что прирост производительности отсутствует? Какого размера блоки записываются за одну операцию одним потоком? Пишем только в конец или в любую позицию? sharmankaВопрос по этому счетчику - как, куда, каким образом? 14877167 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:19:32 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
jdroid он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-) AFAIK там очередь и однопоточная запись в файл. Так ведь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:20:22 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Blazkowiczjdroid он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-) AFAIK там очередь и однопоточная запись в файл. Так ведь? давно там не лазил, но вряд-ли за это время придумали что-то революционное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 14:37:04 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, получилось по способу, который я описывал выше. P.S.: Если кому-то интересно, то на этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength. В нитях же, в зависимости от номера текущей нити пропускаем (номер) * (количество, которое должна записать нить) байт. На выходе имеем запись несколькими нитями одновременно в один файл без всяких локов на файл, счетчиков, и что самое важное - без затираний. Профит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 15:34:41 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaто на этапе, когда конечный размер файла известен, а запись еще не началась Гениально. А если размер файла не известен до записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 15:38:46 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Покажите код, если не сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 15:39:26 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
BlazkowiczГениально. А если размер файла не известен до записи? Не знаю. Как вариант - сбрасывать в какой-то кеш, обсчитывать длину и по накатанной. cdtyjvПокажите код, если не сложно. Да, конечно. Убрал то, что не относится к теме: Основной файл Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Метод ран: Код: 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.09.2013, 15:51:09 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
Слишком узкоспециализированный код. Нормально подходит только для случаев, когда потоки пишут данные одинаковой длины. Плюс общее количество этих данных должно быть известно заранее. В первом вашем сообщении постановка задачи была более общей, и данные вариант кода ее не решает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2013, 19:16:17 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaВсем спасибо, получилось по способу, который я описывал выше. P.S.: Если кому-то интересно, то на этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength. В нитях же, в зависимости от номера текущей нити пропускаем (номер) * (количество, которое должна записать нить) байт. На выходе имеем запись несколькими нитями одновременно в один файл без всяких локов на файл, счетчиков, и что самое важное - без затираний. Профит. как вариант сферического коня в вакууме для решения абстрактных задач программирования решение вполне достойное а если приложение должно работать хотя бы год без перезагрузки какой размер файла резервировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 10:24:03 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
cdtyjvСлишком узкоспециализированный код. Нормально подходит только для случаев, когда потоки пишут данные одинаковой длины. Плюс общее количество этих данных должно быть известно заранее. В первом вашем сообщении постановка задачи была более общей, и данные вариант кода ее не решает. Та это постоянно такое. Сначала задаётся общий вопрос. На него даётся масса ответов. Затем следует ответ в стиле, "никто не смог помочь, но я молодец нашел решение для своего частного случая". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 10:33:20 |
|
||
|
RandomAccessFile
|
|||
|---|---|---|---|
|
#18+
sharmankaна этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength. у меня всего два потока, причем точно знаю что первый запишет в файл 20 терабайт, а второй всего 10 байт. что делать если работа планировщика потоков недетерминирована и отличается в зависимости от реализации JVM а я не хочу резервировать 20 терабайт для записи 10 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 10:52:01 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128543]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
37ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
91ms |
get tp. blocked users: |
1ms |
| others: | 283ms |
| total: | 475ms |

| 0 / 0 |
