Производительность / устойчивость файла С отображенной памятью - Собственного компонента или MappedByteBuffer - по сравнению с простым FileOutputStream

Я знаком с тем, что вы можете создать адаптивный дизайн в iOS, используя концепцию AutoLayout .

Но прежде чем начать, вы должны знать об основах проектирования в iOS

. Что касается того, как работать с портретным и ландшафтным режимами с AutoLayout, вы проверяете этот StackOverflow обсуждение.

11
задан noahlz 11 February 2009 в 16:46
поделиться

6 ответов

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

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

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

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

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

4
ответ дан 3 December 2019 в 08:57
поделиться

Ввод-вывод с отображенной памятью не сделает Ваши диски выполненными быстрее (!). Для линейного доступа это кажется немного бессмысленным.

NIO отображенный буфер является реальной вещью (обычный протест о любой разумной реализации).

Как с другой NIO прямые выделенные буферы, буферы не являются нормальной памятью, и привычка получают GCed как эффективно. При создании многих из них, можно найти, что у Вас заканчивается память/адресное пространство, не заканчиваясь "кучу" Java. Это - очевидно, беспокойство с длительными процессами.

5
ответ дан 3 December 2019 в 08:57
поделиться

Как упоминалось выше, используйте NIO (он же new IO). Также выходит новый, новый ввод / вывод.

Правильное использование решения для жесткого диска RAID поможет вам, но это будет болезненно.

Мне действительно нравится идея сжатия данных. Перейти на gzipoutputstream чувак! Это удвоит вашу пропускную способность, если процессор сможет не отставать.

0
ответ дан 3 December 2019 в 08:57
поделиться

Если Вы запишете меньше байтов, то это будет быстрее. Что, если Вы пропустили его через gzipoutputstream, или что, если Вы записали свои данные в ZipFiles или JarFiles?

0
ответ дан 3 December 2019 в 08:57
поделиться

Что касается точки 3 - если машина отказывает и существуют любые страницы, которые не были сброшены к диску, затем они потеряны. Другой вещью является трата адресного пространства - отображение файла к памяти использует адресное пространство (и требует непрерывной области), и хорошо, на 32-разрядных машинах это немного ограничено. Но Вы сказали, что приблизительно 100 МБ - таким образом, это не должна быть проблема. И еще одна вещь - расширение размера отображенного файла требует некоторой работы.

Между прочим, это ТАК обсуждение может также дать Вам некоторое понимание.

1
ответ дан 3 December 2019 в 08:57
поделиться

На основе моего опыта файлы с отображенной памятью работают НАМНОГО лучше, чем простой доступ к файлу и в реальное время и в варианты использования персистентности. Я работал, прежде всего, с C++ в Windows, но действия Linux подобны, и Вы планируете использовать JNI так или иначе, таким образом, я думаю, что он относится к Вашей проблеме.

Поскольку пример механизма персистентности основывался на файле с отображенной памятью, посмотрите Метанабор. Я использовал его в приложении, где объекты были простыми представлениями по данным с отображенной памятью, механизм заботился обо всем отображающемся материале позади занавесок. Это было и быстро и эффективная память (по крайней мере, по сравнению с традиционными подходами как те предыдущая используемая версия), и мы получили транзакции фиксации/отката бесплатно.

В другом проекте я должен был записать приложения многоадресной сети. Данные были, отправляют в рандомизированном порядке минимизировать влияние последовательной потери пакетов (объединенный с FEC и блокирующимися схемами). Кроме того, данные могли превысить адресное пространство (видеофайлы были больше, чем 2 ГБ), таким образом, выделение памяти было исключено. На стороне сервера разделы файлов были с отображенной памятью по требованию, и сетевой уровень непосредственно выбрал данные из этих представлений; как следствие использование памяти было очень низким. На стороне получателя не было никакого способа предсказать порядок, в который были получены пакеты, таким образом, это должно поддержать ограниченное количество активных представлений о конечном файле, и данные были скопированы непосредственно в эти представления. Когда пакет должен был быть помещен в неотображенную область, самое старое представление было не отображено (и в конечном счете сброшено в файл системой), и заменил новым представлением о конечной области. Действия были выдающимися, особенно потому что система сделала отличную работу при фиксации данных как фоновая задача, и ограничения реального времени были легко встречены.

С тех пор я убежден, что даже лучшая прекрасно созданная схема программного обеспечения не может разбить политику ввода-вывода системы по умолчанию файлом с отображенной памятью, потому что система знает больше, чем приложения пространства пользователя о том, когда и как данные должны быть записаны. Кроме того, что важно для знания, то, что размещение в ОЗУ - необходимость при контакте с большими данными, потому что данные никогда не выделяются (следовательно потребление памяти), но динамично отображаются в адресное пространство и управляются диспетчером виртуальной памяти системы, который всегда быстрее, чем "куча". Так система всегда используют память оптимально и данные фиксаций каждый раз, когда это должно за спиной приложения, не влияя на него.

Надежда это помогает.

2
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: