导入大型itunes epf数据库无法正常工作

时间:2015-04-21 06:01:56

标签: php codeigniter itunes large-files epf

我试图导入EPF关系数据库。 Itunes epf关系数据库由所有数据库(应用程序,音乐,电视节目,游戏等)的细节组成。你可以在这里找到更多信息Itunes EPF Relation Database我可以导入除一个未处理的数据库之外的所有数据库。这个文件大约6GB。

$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中完成,它是导入过程的控制器。此代码适用于高达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);
                                }

它甚至适用于8gb文件,导入完成并成功完成。但是对于6gb文件,导入不会继续。这是表

的示例数据
  

1426669253786 | 329704232 | EN | iParrot Phrase越南语 - 意大利语|翻译   越南短语到意大利语接听翻译   iPad / iPhone / iPod Touch |

     

iParrot Phrase为即时多语言设定了新标准   翻译软件。专为iPad / iPhone / iPod设计   触摸,它有超过20种完美明显的口服   即时使用的语言。 iParrot Phrase按类别分类   例如:问候,交通,购物和寻求帮助   等等,你就可以立即找到你需要的句子了。   有组织的即时访问和轻松,它特别有用   出国旅游。虚拟流利,中文,英文,   日语,俄语,法语,德语,西班牙语,意大利语,韩语,   葡萄牙语,阿拉伯语,泰语和越南语。

     

这是来自该数据库的样本数据,它是应用程序详细信息(在上面的示例数据中,我用|)替换了新字段的ASCII字符(SOH)。实际上当导入正在使用第二个代码时,当新行将其作为/ n并且导入被破坏时。那么有没有办法绕过这个或任何其他方法来处理这样的大文件(6 GB)进行数据库导入?也许上面的事情有点混乱。有没有需要澄清,那么我会更清楚。寻找一个好的解决方案..谢谢大家。

1 个答案:

答案 0 :(得分:0)

我在PHP中没有为您提供直接答案,但问题很可能是您将文件加载到内存中。诀窍是将文件流式传输并以块的形式写入。

在python中,您可以使用requests library,这样可以很好地执行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()