2015-04-21 5 views
1

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

$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, который является контроллером для кода импорта process.This работает около ДО 2gb файла. Но размер больше, чем тот, что он не работает. Возможно, его чтение всего файла и памяти не позволяет это сделать. Поэтому я использовал приведенный ниже код для обработки более высоких файлов.

$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 ГБ, и импорт выполнен и успешно завершен. Но тогда для файла с 6 гб импорт не происходит. Это выборочные данные для таблицы

1426669253786 | 329704232 | EN | iParrot Разговорник Вьетнамский-итальянский | Перевести вьетнамский разговорник на итальянский с захватом-переводчик для IPad/iPhone/IPod Touch |

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

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

ответ

0

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

В питона можно использовать requestslibrary, например, что делает Auth красиво (и вы могли бы написать скачать логику, может быть более простым способом. Это будет выглядеть как-то вроде этого

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

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

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() 
+0

fgets работать для больших файлов, так он читает содержимое по строкам. Но если в содержании, если есть/n или аналогичные теги, то удаление заражения становится сложным и его неправильный вывод. – vantony