на лабу нужно сделать алгоритм внешней сортировки. все сделал, но работает с маленькими файлами, которые за рз в оперативу влазят. Но когда дело доходит до большого файла (9 гб) , метод scaner-а nextInt не работает (тоесть с маленькими файлами - пашет с большими нет) . в чем может быть проблема? или большие файлы нужно как-то по другому считывать?
Если нужно - листинг программы предоставлю.
Другие языки программирования и технологии
считать большой файл.
Большой объём файла (т. е. не помещающийся в оперативную память) лишает возможности произвести сортировку целиком в оперативке. Значит текстовый формат файла для сортировки не подойдёт, необходим произвольный доступ. С другой стороны, хотелось бы максимально снизить количество обращений к диску (т. е. какое-нибудь кэширование) , но это ограничивает "произвольность" доступа.
Ограничим фантазию выбора:
Естественные ограничения: сортировать в оперативке целиком нельзя, слишком большой объём.
Дополнительные ограничения: алгоритм не должен обращаться последовательно в несколько удалённых друг от друга мест файла (чтобы кэширование имело эффект) .
Это лаба: Для простоты использовать уже готовый алгоритм (причём простой, без модификаций) , не комбинировать алгоритмы, выполнять всё в одном потоке (thread).
java - Для работы с большими файлами можно использовать прямое отображение файла в память (java.nio.MappedByteBuffer)
В качестве алгоритма взять Merge sort - довольно быстрый O(n·lg(n)), потребует дополнительно места на диске в объёме n/2. Кэширование не пострадает (этот алгоритм использовался даже для сортировки данных на магнитной ленте) .
смотреть: http : // en . wikipedia . org / wiki / Sorting_algorithm ; http : // en . wikipedia . org / wiki / Merge_sort ; http : // www . sorting-algorithms . com / merge-sort
Ограничим фантазию выбора:
Естественные ограничения: сортировать в оперативке целиком нельзя, слишком большой объём.
Дополнительные ограничения: алгоритм не должен обращаться последовательно в несколько удалённых друг от друга мест файла (чтобы кэширование имело эффект) .
Это лаба: Для простоты использовать уже готовый алгоритм (причём простой, без модификаций) , не комбинировать алгоритмы, выполнять всё в одном потоке (thread).
java - Для работы с большими файлами можно использовать прямое отображение файла в память (java.nio.MappedByteBuffer)
В качестве алгоритма взять Merge sort - довольно быстрый O(n·lg(n)), потребует дополнительно места на диске в объёме n/2. Кэширование не пострадает (этот алгоритм использовался даже для сортировки данных на магнитной ленте) .
смотреть: http : // en . wikipedia . org / wiki / Sorting_algorithm ; http : // en . wikipedia . org / wiki / Merge_sort ; http : // www . sorting-algorithms . com / merge-sort
64-битный компилятор и большой файл подкачки спасут гиганта мысли? Это если в лоб.
Если не в лоб, то надо:
1. Пройтись по всему большому файлу, узнать, каков диапазон значений.
2. Поделить диапазон на N равных частей.
3. Пройтись еще раз и слить все в N файлов.
4. Отсортировать каждый из файлов в отдельности (тут бы весело это дело распараллелить, но мы помним, что у нас мало оперативы, поэтому не параллелим) .
5. Слить получившиеся файлы опять в один.
Сие работает при более-менее ровном распределении сортируемых значений, если оно не такое - надо "по-умному" делить диапазон. Впрочем, это не слишком сложно. Удачи.
Если не в лоб, то надо:
1. Пройтись по всему большому файлу, узнать, каков диапазон значений.
2. Поделить диапазон на N равных частей.
3. Пройтись еще раз и слить все в N файлов.
4. Отсортировать каждый из файлов в отдельности (тут бы весело это дело распараллелить, но мы помним, что у нас мало оперативы, поэтому не параллелим) .
5. Слить получившиеся файлы опять в один.
Сие работает при более-менее ровном распределении сортируемых значений, если оно не такое - надо "по-умному" делить диапазон. Впрочем, это не слишком сложно. Удачи.
Похожие вопросы
- Поиск в большом файле C++
- как сжать большой файл?
- Как занести данные считанные из файла в массив на языке си?
- как считать из файла число с плавающей запятой в Си? точку нормально воспринимает, а запятую нет.
- Сформировать файл из действительных чисел. Найти: наибольшее из значений модулей компонентов с четными номерами. С++
- Как на PHP получать пути к файлам из массива names в теге input при загрузке некольких файлов?
- C++ Файлы. помогите чем можете . за хороший ответ подарю денюжку
- Как при считывании с файла даних, можно было бы вернуться на символ назад. тоесть один и тотже символ считать два раза
- Как считать слова из текстового файла в с++?
- Помогите написать bat файлы, срочно надо, сам изучить уже не успеваю