我正在导入一个包含超过5,000条记录的csv文件。我目前正在做的是,将所有文件内容作为一个数组并逐个保存到数据库中。但是在脚本失败的情况下,整个过程将再次运行,如果我再次开始逐个检查它们,它会使用大量查询,所以我想暂时将导入的值保存在会话中。
在会话中保留那么多记录是一种好习惯吗?或者还有其他方法吗?
谢谢。
答案 0 :(得分:5)
如果你必须分阶段完成这项任务(这里有一些建议可以改进你在一次通过中做事的方式),不要在$ _SESSION中保存csv文件......这是毫无意义的开销,因为你已经在磁盘上安装了csv文件,并且只是在编写会话数据时为进程添加了大量的序列化/反序列化开销。
您正在逐个处理CSV记录,因此请计算您在$ _SESSION中成功处理的数量。如果脚本超时或barfs,则重新启动并读取已处理的数量,以便知道文件在何处重新启动。
答案 1 :(得分:2)
$ _SESSION的最大大小是什么?
会话在运行时加载到内存中 - 所以它受php.ini中的memory_limit限制
在会话中保留那么多记录是不错的做法
不 - 由于您描述的原因 - 它也会对性能产生重大影响。
或者还有其他方法吗?
这取决于你想要实现的目标。大多数数据库可以直接导入CSV文件,也可以使用比PHP代码更快,更有效的工具。
下进行。
答案 2 :(得分:1)
这不是一个好主意,因为会话数据将针对每个页面请求进行序列化/反序列化,即使它们与您正在执行的操作无关。
我建议使用以下解决方案:
如果出现故障,插件将被回滚,因此您知道可以安全地重做插入,而不必担心重复数据。
答案 3 :(得分:1)
回答实际问题(有人刚问了一个副本,但删除了它有利于这个问题)
默认会话数据处理程序将其数据存储在临时文件中。从理论上讲,这些文件可以与文件系统允许的一样大。
但是,正如@symcbean指出的那样,会话初始化时会话数据会自动加载到脚本的内存中。这会严重限制您应在会话数据中存储的最大大小。此外,加载大量数据会对性能产生巨大影响。
如果您需要存储大量数据连接到会话,我建议使用您按当前会话ID命名的临时文件。然后,您可以根据需要处理这些文件,并尽可能在脚本的memory_limit
范围内处理。
答案 4 :(得分:0)
如果您正在使用Postgresql,您可以使用单个查询使用pg_copy_from来插入它们,或者您可以使用pg_put_line,如显示in the example(从stdin复制),我发现在导入时非常有用大量的数据。
如果您使用MySql,则必须进行多次插入。请记住使用事务,这样如果您使用事务,如果您的查询失败,它将被取消,您可以重新开始。请注意,5000行不是那么大!但是你应该知道max_execution_time约束,它会在几秒钟后终止你的脚本。
对于SESSION而言,我相信你受到脚本可以使用的最大内存量的限制(php.ini中的memory_limit)。会话数据保存在文件中,因此如果连接了许多客户端,还应考虑磁盘空间使用情况。
答案 5 :(得分:0)
这取决于操作系统文件大小,无论会话大小如何,每页默认值为128 MB。