#php #arrays #file
#php #массивы #файл
Вопрос:
У меня большой файл, 100 000 строк. Я могу прочитать каждую строку и обработать ее, или я могу сохранить строки в массиве, а затем обработать их. Я бы предпочел использовать массив для дополнительных функций, но меня действительно беспокоит использование памяти, связанное с хранением такого количества строк в массиве, и стоит ли оно того.
Комментарии:
1. Вам нужно сделать это только один раз, или многие одновременные веб-пользователи будут запускать это действие? И если их много, почему бы не сохранить содержимое файла в базе данных?
2. Вы можете использовать
SplFileObject
для получения доступа к текстовым строкам, подобного массиву (итератор).3. Вероятно, вы не нашли лучшего подхода к своей проблеме. Редко вам потребуется, чтобы в памяти были одновременно открыты все 100 000 строк. Подумайте о других способах сделать это, у вас возникнут проблемы с производительностью вашего существующего плана.
4. @Michael Если я помещу его в базу данных, мне все равно придется извлекать их все из базы данных, чтобы обрабатывать их один за другим, и я не хочу делать отдельный вызов для извлечения их 1 на 1, поэтому мы возвращаемся к тому же вопросу. У меня будет много из них в каком-то объекте.
Ответ №1:
Есть две функции, с которыми вам следует ознакомиться.
Первый — это file()
, который считывает весь файл в массив, причем каждая строка является элементом массива. Это хорошо для файлов меньшего размера, и, вероятно, это не то, что вы хотите использовать для файла в 100 тыс. строк. Эта функция самостоятельно управляет файлами, поэтому вам не нужно явно открывать и закрывать файл самостоятельно.
Второй — это fgets()
, который вы можете использовать для чтения файла по одной строке за раз. Вы можете использовать это для выполнения цикла до тех пор, пока есть больше строк для обработки, и запускать обработку строк внутри цикла. Вам нужно будет использовать fopen()
чтобы получить дескриптор этого файла, вы можете самостоятельно отслеживать указатель на файл для управления восстановлением (т. Е. Чтобы вам не пришлось перезапускать обработку с нуля, если что-то пойдет не так и скрипт завершится сбоем) и т.д.
Надеюсь, этого достаточно, чтобы вы начали.
Ответ №2:
Как насчет комбинации этих двух? Прочитайте 1000 строк в массив, обработайте его, удалите массив, затем прочитайте еще 1000 и т.д. Контролируйте использование памяти и регулируйте, сколько вы читаете в массив за раз.