Импорт большой базы данных itunes epf не работает

Я пытаюсь импортировать реляционную базу данных EPF. Реляционная база данных Itunes epf состоит из деталей всей базы данных (приложения, музыка, телешоу, игры и т. Д.). Вы можете найти больше об этом здесь. База данных отношений Itunes EPF. Я могу импортировать все базы данных, кроме одной, которая не обрабатывается. Этот файл составляет около 6 ГБ.

$field_separator = chr(1);
                                $record_separator = chr(2)."\n";   
                                $data_appdt=explode($record_separator,file_get_contents('file_path',true));
                                    foreach ($data_appdt as $key => $value) 
                                    {
                                    if (substr($value, 0, 1) != '#')
                                        {
                                            if (!empty($value))
                                            {
                                            {
                                                $data_itu_app_dt=explode($field_separator, $value);
                                                $result=$this->admin_model->itunes_app_dt($data_itu_app_dt);
                                            }
                                            }
                                        }
                                    }

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

    $handle = fopen('file_path', "r") or die("Couldn't get handle");
                            if ($handle) {
                            while (!feof($handle)) {
                            $buffer = fgets($handle, 4096);
                            $data_appp=explode($record_separator,$buffer);
                            foreach ($data_appp as $key => $value) 
                            {
                            if (substr($value, 0, 1) != '#')
                            {
                                if (!empty($value))
                                {
                                    $data_itu_appp=explode($field_separator, $value);
                                    //print_r($data_itu_appp);
                                    $result=$this->admin_model->itunes_appp($data_itu_appp);
                                }
                            }   
                            }
                                }
                            fclose($handle);
                                }

Он работает даже с файлами размером 8 ГБ, и импорт успешно завершен. Но тогда для файла 6gb импорт не происходит. Это пример данных для таблицы

1426669253786|329704232|EN|iParrot Фраза Вьетнамский-Итальянский | Перевести вьетнамский Фраза на итальянский Принимая переводчик для iPad /iPhone /iPod Touch |

iParrot Phrase устанавливает новый стандарт программного обеспечения для мгновенного многоязычного перевода. Разработанный специально для iPad/iPhone/iPod Touch, он снабжен более чем 20 видами прекрасно выраженного устного языка для мгновенного использования. Фраза iParrot организована в такие категории, как: приветствия, транспорт, покупки, просьба о помощи и т. д. Таким образом, вам достаточно мгновенно найти нужные предложения. Организованный для быстрого доступа и простоты, он особенно полезен при поездках за границу. Доступна виртуальная беглость на китайском, английском, японском, русском, французском, немецком, испанском, итальянском, корейском, португальском, арабском, тайском и вьетнамском языках.

Это пример данных из этой базы данных, который является подробным описанием приложения (в приведенном выше примере данных я заменил символы ASCII (SOH) для нового поля на |). На самом деле, когда импорт выполняется с использованием второго кода, когда появляется новая строка, он принимает его как / n и импорт прерывается. Так есть ли способы обойти этот или любой другой метод обработки такого большого файла (6 ГБ) для импорта базы данных? Возможно, вышесказанное немного сбивает с толку. Нужны ли какие-то разъяснения, тогда я сделаю все более ясным. Ищете хорошее решение.. Спасибо всем.

1 ответ

У меня нет прямого ответа для вас в php, но проблема, скорее всего, в том, что вы загружаете файл в память. Хитрость заключается в потоковой передаче файла и записи его кусками.

В Python вы можете использовать requests библиотека, например, которая делает Auth приятно (и вы могли бы написать свою логику загрузки, возможно, в более легкой форме. Это будет выглядеть примерно так

username='yourusernamehere'
password='yourpasswordhere'
response = requests.get('https://feeds.itunes.apple.com/feeds/', auth=(username, password), stream=True)

Обратите внимание, что я использовал stream=True Механизм, потому что вы будете загружать огромные файлы, которые, вероятно, не уместятся в памяти, вы должны использовать chunking следующим образом:

 with open(local_filename, 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:  # filter out keep-alive new chunks
            f.write(chunk)
            f.flush()
Другие вопросы по тегам