У меня есть файл размером 2GB, в котором есть записи студента. Мне нужно найти студентов на основе определенных атрибутов в каждой записи и создать новый файл с результатами. Порядок отфильтрованных студентов должен быть таким же, как в исходном файле. Каков эффективный & самый быстрый способ сделать это с помощью Java IO API и потоков без проблем с памятью? Максимальный размер для JVM установлен на 512 МБ.Обработка файлов в java
ответ
- 2GB для файла огромен, вам ДОЛЖНО идти на дБ.
- Если вы действительно хотите использовать Java I/O API, то попробуйте это: Handling large data files efficiently with Java и это: Tuning Java I/O Performance
Какой файл? Текстовые, как CSV?
Самый простой способ - сделать что-то вроде grep: Прочитайте файл по строкам, проанализируйте строку, проверьте свой критерий фильтра, если совпадаете, выводите строку результатов, затем переходите к следующей строке, пока файл готово. Это очень эффективная память, так как вы одновременно загружаете только текущую строку (или буфер немного больше). Ваш процесс должен прочитать весь файл только один раз.
Я не думаю, что несколько потоков помогут. Это сделало бы вещи намного более сложными, и поскольку процесс, похоже, связан с I/O, в любом случае, попытка прочитать один и тот же файл с несколькими потоками, вероятно, не улучшит пропускную способность.
Если вы обнаружите, что вам нужно делать это часто, и каждый раз, проходя через файл, вы слишком строгие, вам нужно создать какой-то индекс. Самый простой способ сделать это - импортировать файл в БД (может быть встроенным БД, таким как SQLite или HSQL).
О, мальчик, я печатал точно такой же ответ. Это действительно все сводится к тому, чтобы делать работу просто по строкам, а не хранить все это в памяти Java. – BalusC
Я бы не перекомплементировал это, пока не обнаружил, что скучно простой способ не подходит для того, что вам нужно. По существу, вам просто нужно:
- открыть входной поток до 2 Гб файлов, запоминание в буфере (например, упаковка с BufferedInputStream)
- потока открытого выхода в фильтрованной файл, который вы собираетесь создать
- прочитал первую запись из потока ввода, посмотрите на любой атрибут, чтобы решить, нужно ли вам это делать; если да, то напишите его в выходной файл
- повторить для остальных записей
На одном из моих тестовых систем с очень скромным оборудованием, BufferedInputStream вокруг FileInputStream из коробки прочитать около 500 МБ в течение 25 секунд, т.е. вероятно, менее 2 минут для обработки вашего 2GB-файла, а размер буфера по умолчанию в основном такой же хороший, как и он (см. BufferedInputStream timings, который я сделал для получения дополнительной информации). Я предполагаю, что с современными аппаратными средствами вполне возможно, что время будет сокращено наполовину.
Следует ли вам приложить много усилий, чтобы уменьшить 2/3 минуты или просто пойти навстречу, пока вы его ждали, это решение, которое вам нужно будет сделать в зависимости от ваших требований , Я думаю, что опция базы данных не будет покупать вас много, если вам не нужно делать много разных прогонов обработки в одном наборе данных (и есть другие решения для этого, которые автоматически не означают базу данных).
+1, особенно. за то, что «пойдите на крошечку, пока вы ждете» –
Я думаю, вы должны использовать memory mapped files.This помогут вам карту большего размера файла в меньших memory.This будут действовать как виртуальную память, и насколько производительность обеспокоена отображенные файлы быстрее, чем поток запись/чтение ,
- 1. Обработка файлов Java Обработка записей
- 2. flush() обработка файлов java
- 3. Java - обработка больших файлов
- 4. Обработка огромных файлов в java
- 5. Java - Обработка файлов Символов Файл
- 6. Автоматическая обработка файлов/входных потоков в Java
- 7. Параллельная обработка нескольких файлов в java
- 8. Обработка больших файлов no в Java
- 9. Обработка большого количества текстовых файлов в java
- 10. Обработка файлов CSV в java. Добавление материала
- 11. Java: автоматическая обработка файлов cookie в HttpClient?
- 12. Мудрая обработка файлов в программировании Java Hadoop
- 13. обработка огромных файлов несколько раз в JAVA
- 14. Обработка исключений для расширения файлов в java
- 15. Обработка/чтение .BAI2 файлов в java
- 16. Обработка файлов в Erlang
- 17. Обработка файлов в COBOL
- 18. Обработка текстовых файлов - с использованием java
- 19. Java: обработка больших файлов во входных потоках
- 20. Обработка аннотаций из java-файлов без компиляции
- 21. Обработка файлов Java, что я сделал неправильно?
- 22. Обработка файлов
- 23. Обработка файлов в ядре ядра
- 24. Обработка файлов в ABAP
- 25. Обработка файлов в kivy
- 26. Обработка файлов в JavaScript
- 27. Обработка файлов в ReactJS
- 28. Обработка файлов в python
- 29. Обработка файлов в .NET
- 30. Обработка файлов в pic32
Рассмотрите возможность хранения информации в базе данных, а не в файле размером 2 ГБ. Сделайте это для студентов. База данных – polygenelubricants
не является для меня вариантом. Я получу данные в текстовых файлах, и я должен обработать их. –
Невозможно получить X фунтов всего в сумке X/N, где N> 1. Вы никогда не сжимаете все содержимое этого файла в память сразу без сжатия. – duffymo