PHP 通过许多调整将 JSON/CSV 匹配到 SQL 数据库(蛋糕PHP)
PHP match JSON/CSV into SQL database with many adjustments (cakePHP)
我想使用 cakePHP 框架将 JSON 文件(也可作为 CSV)插入到 mySQL 数据库中。基础很清楚,但是周围的要求让它变得困难:
- JSON/CSV 文件很大(大约 200 MB,最多 200.000 行)。
- 该文件包含几个字段。这些字段需要映射到 mySQL 数据库中具有不同名称的字段。
- CSV 包含一个名为 art_number 的字段。该字段也存在于 mySQL 数据库中。 art_number是唯一的,但不是mySQL中的主键。如果 CSV 和数据库具有相同的 art_number,我想更新 mySQL 记录。如果不是,则应创建一个新记录。
- CSV 文件的几个字段在存储之前需要进行处理。还需要添加其他字段。
- CSV 包含 image_URL。如果它是数据库的新记录(未知 art_number),则应复制、修改(使用 imagick)并存储在服务器上。
- 整个工作需要每天运行。
如您所见,有很多限制(内存、运行时间等)。但我不确定如何从架构的角度来处理这个问题。例如。我应该先尝试将所有内容插入单独的 "import" 数据库 table 然后 运行 分别完成这些步骤吗?从数据库中获取 ID 映射到 CSV 行的好方法是什么?如果我能够根据 art_number 映射 ID,Cakephp 能够执行创建新记录或更新现有记录。更改和复制多达 200.000 张图像似乎也是一个大问题。那么如何将其分解成更小的块?
如果您能在这里帮助找到正确的策略,我将不胜感激。在内存和速度方面我需要考虑什么?将流程分成不同的工作是否有意义? What/how oyu 会那样做吗?
I would appreciate if you could help find the right strategy here. What do I need to consider in terms of memory and speed?
- Use a shell 用于导入
- Read the data in chunks X 行或 X 数据量以避免内存问题,然后处理这些块。这是一个简单的循环。
- 如果处理需要很长时间,请考虑使用像 Resque 这样的作业队列。如果需要,您可以向用户更新进度状态。
Doe sit make sense to split the process into different jobs? What/how would oyu do that?
这取决于要求和您的处理需要多长时间,以及您的系统可以并行处理多少,而不会达到 100% CPU 使用率并有效地减慢网站速度。如果发生这种情况,请将处理移至另一台机器或使用 the nice command.
限制该进程的 CPU 使用率
我想使用 cakePHP 框架将 JSON 文件(也可作为 CSV)插入到 mySQL 数据库中。基础很清楚,但是周围的要求让它变得困难:
- JSON/CSV 文件很大(大约 200 MB,最多 200.000 行)。
- 该文件包含几个字段。这些字段需要映射到 mySQL 数据库中具有不同名称的字段。
- CSV 包含一个名为 art_number 的字段。该字段也存在于 mySQL 数据库中。 art_number是唯一的,但不是mySQL中的主键。如果 CSV 和数据库具有相同的 art_number,我想更新 mySQL 记录。如果不是,则应创建一个新记录。
- CSV 文件的几个字段在存储之前需要进行处理。还需要添加其他字段。
- CSV 包含 image_URL。如果它是数据库的新记录(未知 art_number),则应复制、修改(使用 imagick)并存储在服务器上。
- 整个工作需要每天运行。
如您所见,有很多限制(内存、运行时间等)。但我不确定如何从架构的角度来处理这个问题。例如。我应该先尝试将所有内容插入单独的 "import" 数据库 table 然后 运行 分别完成这些步骤吗?从数据库中获取 ID 映射到 CSV 行的好方法是什么?如果我能够根据 art_number 映射 ID,Cakephp 能够执行创建新记录或更新现有记录。更改和复制多达 200.000 张图像似乎也是一个大问题。那么如何将其分解成更小的块?
如果您能在这里帮助找到正确的策略,我将不胜感激。在内存和速度方面我需要考虑什么?将流程分成不同的工作是否有意义? What/how oyu 会那样做吗?
I would appreciate if you could help find the right strategy here. What do I need to consider in terms of memory and speed?
- Use a shell 用于导入
- Read the data in chunks X 行或 X 数据量以避免内存问题,然后处理这些块。这是一个简单的循环。
- 如果处理需要很长时间,请考虑使用像 Resque 这样的作业队列。如果需要,您可以向用户更新进度状态。
Doe sit make sense to split the process into different jobs? What/how would oyu do that?
这取决于要求和您的处理需要多长时间,以及您的系统可以并行处理多少,而不会达到 100% CPU 使用率并有效地减慢网站速度。如果发生这种情况,请将处理移至另一台机器或使用 the nice command.
限制该进程的 CPU 使用率