|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38405963&tid=2128543]: |
0ms |
get settings: |
17ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
116ms |
get tp. blocked users: |
7ms |
| others: | 290ms |
| total: | 545ms |

| 0 / 0 |
