Oracle apex Oracle APEX_数据_解析器执行大文件的时间爆炸
(抱歉,没有足够的代表点对类似问题发表评论) 当apex_data_解析器处理超过50MB的文件时,执行时间会激增。 正如在这里提出的问题:,我必须同意oCoXa,解析器中一定有一个bug 我在ATP+APEX 19.2.0.00.18上发现了完全相同的问题。 我还看到在解析大于50mb的文件时IO和CPU出现峰值,低于50mb时根本没有峰值 我已经将两个文件加载到一个表(一个41_temp_文件),一个是54mb,另一个是47mb。(相同的行,直到47mb) 在这两种情况下,我只是解析文件中171.000和199.000行中的3000行 我在SQLDeveloper中运行解析器,47mb需要1,9秒,54mb需要88,6秒Oracle apex Oracle APEX_数据_解析器执行大文件的时间爆炸,oracle-apex,Oracle Apex,(抱歉,没有足够的代表点对类似问题发表评论) 当apex_data_解析器处理超过50MB的文件时,执行时间会激增。 正如在这里提出的问题:,我必须同意oCoXa,解析器中一定有一个bug 我在ATP+APEX 19.2.0.00.18上发现了完全相同的问题。 我还看到在解析大于50mb的文件时IO和CPU出现峰值,低于50mb时根本没有峰值 我已经将两个文件加载到一个表(一个41_temp_文件),一个是54mb,另一个是47mb。(相同的行,直到47mb) 在这两种情况下,我只是解析文件中1
select *
from A41_temp_files f,
table(
apex_data_parser.parse(
p_content => f.BLOB_CONTENT,
p_max_rows => 3000,
P_DETECT_DATA_TYPES => 'N',
p_file_name => f.FILENAME
)
) p
where 1=1
and f.filename = 'CHUCK_47mb.txt' --3000 lines 1,9sec
--and f.filename = 'CHUCK_54mb.txt' --3000 lines 88,6sec
order by col001
;
为了提高APEX_DATA_PARSER.parse的性能,预计算文件的配置文件会很有帮助(这可能非常耗时) 函数返回JSON格式的文件配置文件
select apex_data_parser.discover(
p_content => {BLOB containing XLSX file},
p_file_name=>'large.xlsx' ) as profile_json
from dual;
然后可以在解析函数中使用此配置文件(因此解析函数不必执行获取文件信息的附加步骤):
为了提高APEX_DATA_PARSER.parse的性能,预计算文件的概要文件(这可能会非常耗时)会很有帮助 函数返回JSON格式的文件配置文件
select apex_data_parser.discover(
p_content => {BLOB containing XLSX file},
p_file_name=>'large.xlsx' ) as profile_json
from dual;
然后可以在解析函数中使用此配置文件(因此解析函数不必执行获取文件信息的附加步骤):
APEX_DATA_解析器包确实有一个50MB的“阈值” 对于小于50MB的BLOB,APEX将创建一个新的缓存(!)临时LOB,复制数据并对该临时LOB执行所有解析。所以所有LOB操作都发生在内存中 如果BLOB大于50MB,则不会创建临时LOB,并且APEX_DATA_PARSER的LOB操作将在传入的LOB定位器上执行。在您的情况下,它是列A41_TEMP_FILES.BLOB_内容的LOB定位器。因此,所有LOB操作都发生在磁盘中,这使得磁盘运行速度变慢 APEX构建为在具有多个工作区和并行用户的共享实例上运行-因此此阈值是为了保护(共享)SGA和数据库内存 但是,使用APEX_DATA_PARSER包的开发人员始终可以自己创建一个缓存的临时LOB,并将其传递给APEX_DATA_PARSER.PARSE。为此,使用DBMS_LOB.CREATETEMPORARY过程和P_CACHE=>TRUE来创建临时LOB,然后使用DBMS_LOB.COPY将上传的BLOB中的数据复制到临时BLOB,然后将临时BLOB传递给APEX_data_PARSER.PARSE 例如 然后在APEX_DATA_解析器中使用此函数,如下所示:
:
apex_data_parser.parse(
p_content => create_cached_blob( f.BLOB_CONTENT),
p_max_rows => 3000,
:
APEX_DATA_解析器包确实有一个50MB的“阈值” 对于小于50MB的BLOB,APEX将创建一个新的缓存(!)临时LOB,复制数据并对该临时LOB执行所有解析。所以所有LOB操作都发生在内存中 如果BLOB大于50MB,则不会创建临时LOB,并且APEX_DATA_PARSER的LOB操作将在传入的LOB定位器上执行。在您的情况下,它是列A41_TEMP_FILES.BLOB_内容的LOB定位器。因此,所有LOB操作都发生在磁盘中,这使得磁盘运行速度变慢 APEX构建为在具有多个工作区和并行用户的共享实例上运行-因此此阈值是为了保护(共享)SGA和数据库内存 但是,使用APEX_DATA_PARSER包的开发人员始终可以自己创建一个缓存的临时LOB,并将其传递给APEX_DATA_PARSER.PARSE。为此,使用DBMS_LOB.CREATETEMPORARY过程和P_CACHE=>TRUE来创建临时LOB,然后使用DBMS_LOB.COPY将上传的BLOB中的数据复制到临时BLOB,然后将临时BLOB传递给APEX_data_PARSER.PARSE 例如 然后在APEX_DATA_解析器中使用此函数,如下所示:
:
apex_data_parser.parse(
p_content => create_cached_blob( f.BLOB_CONTENT),
p_max_rows => 3000,
:
谢谢你的建议,但没什么区别。仅供参考,两个文件的计算json_配置文件是相同的。(应该如此)。实际上,在预先添加JSON配置文件时,运行脚本需要几秒钟的时间,但这当然可能是由缓存/其他正在运行的作业等引起的。无论如何,底线是它没有解决问题。感谢您的建议,但这并没有造成任何影响。仅供参考,两个文件的计算json_配置文件是相同的。(应该如此)。实际上,在预先添加JSON配置文件时,运行脚本需要几秒钟的时间,但这当然也可能是由缓存/其他正在运行的作业等引起的。总之,它没有解决问题。这确实解决了问题。非常感谢你!就性能而言,它的性能与50MB以下的文件相当。仅供参考,我最大的文件是408MB,有160万行,需要约30分钟。因此,最终用户将获得网关超时错误。但这一过程在幕后完成得很好。因此,一旦流程完成,最终用户可以继续该流程…(在另一个页面中,查看解析/加载到接口表的数据)我对代码所做的唯一更改是添加一个if,因此只有当文件大小超过50MB时才会更改。这确实解决了问题。非常感谢你!就性能而言,它的性能与50MB以下的文件相当。仅供参考,我最大的文件是408MB,有160万行,需要约30分钟。因此,最终用户将获得网关超时错误。但这一过程在幕后完成得很好。因此,一旦流程完成,最终用户可以继续流程…(在另一个页面中,查看解析/加载到接口表的数据)我对代码所做的唯一更改是添加一个if,因此只有当文件大小超过50MB时才会更改。