1

我正在尝试导入 EPF 关系数据库。Itunes epf 关系数据库由所有数据库(应用程序、音乐、电视节目、游戏等)的详细信息组成。您可以在此处找到更多信息iTunes EPF 关系数据库我可以导入所有数据库,除了一个未处理的数据库。这个文件大约 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 短语越南语-意大利语|将越南语短语翻译成意大利语

iParrot Phrase 为即时多语言翻译软件设立了新标准。专为 iPad/iPhone/iPod Touch 设计,备有超过 20 种完美发音的口语供即时使用。iParrot Phrase 分为:问候语、交通、购物和寻求帮助等类别。因此,您可以立即找到所需的句子。为即时访问和轻松而组织,它在出国旅行时特别有用。提供中文、英文、日文、俄文、法文、德文、西班牙文、意大利文、韩文、葡萄牙文、阿拉伯文、泰文和越南文的虚拟流利程度。

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

4

1 回答 1

0

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

例如,在 python 中,您可以使用该requests ,它可以很好地进行身份验证(并且您可以以更简单的方式编写下载逻辑。它看起来像这样

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()
于 2015-06-11T17:55:39.087 回答