You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速加载JSONL文件并展开含DataFrame的嵌套列?

大型JSONL文件加载与嵌套列展开提速方案

我有多个大小在100MB到1GB之间的大型压缩包,每个包内包含多个变量,其中部分变量为嵌套DataFrame。压缩包的下载与解压流程运行正常,但后续两项操作耗时极长:

  • 在R中加载JSONL文件
  • 展开包含DataFrame的嵌套列

单文件处理这两步耗时约1分钟,而我需要处理数百个这类文件。想请教提速方法,比如改用map()并行处理、换嵌套列展开方式、或者换JSONL加载方式?

警告:示例脚本会下载一个95MB的.zip文件,内含多个.jsonl文件,请按需使用。

if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  here,
  tidyverse,
  janitor,
  jsonlite
)

#----- 下载与解压(无性能问题) -----#

# URL
url <- "https://data.jobtechdev.se/annonser/historiska/monthly/2006_monthly.zip"

# 指定本地保存目录(可修改为你需要的路径)
here()
download_dir <- here("temp")
filename <- "2006_monthly.zip"

# 目录不存在则创建
if (!dir.exists(download_dir)) {
  dir.create(download_dir)
}

download.file(url, destfile = file.path(download_dir, filename), mode = "wb")
unzip(here("temp", "2006_monthly.zip"), exdir = here("temp"))

#----- 性能瓶颈区域 -----#

# 以下两行耗时极长(标记为#1和#6)

# 1 加载jsonl文件
jsonl_data_2006_01 <- stream_in(file(here("temp", "2006_01.jsonl")))

# 2 清理列名
jsonl_data_2006_01 <- jsonl_data_2006_01 |> clean_names()

# 3 识别包含dataframe的列
dataframe_columns <- sapply(jsonl_data_2006_01, is.data.frame)

# 4 获取包含dataframe的列名
dataframe_column_names <- names(dataframe_columns[dataframe_columns])

# 5 创建TRUE列名的字符向量
true_column_names <- names(dataframe_columns)[dataframe_columns]

# 6 展开包含dataframe的嵌套列
jsonl_data_2006_01_unested <-  jsonl_data_2006_01 |> 
  unnest_wider(true_column_names, names_sep = "_")

编辑说明:
我已将代码重写为函数,并用here()替代相对路径,运行效果良好:

# 加载库
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  here, # 相对路径工具
  tidyverse,
  duckdb,
  jsonlite
)

# 函数定义
import_jsonl_data <- function(select_cols) {
  test <- here::here("data", "dbdata", "2006_*.jsonl")
  duckdb_import_query <- paste0("SELECT ", select_cols, " FROM read_json_auto('", test, "');")
  
  # 启动内存中的DuckDB并加载JSON扩展
  con <- dbConnect(duckdb())
  dbExecute(con, "INSTALL json; LOAD json;")
  
  # 加载所有*.jsonl文件并返回扁平化结构的data.frame
  result <- dbGetQuery(con, duckdb_import_query)
  
  # 关闭连接
  dbDisconnect(con, shutdown=TRUE)
  
  return(result)
}

# 测试调用
data_frame_2006 <- import_jsonl_data(select_cols)

内容的提问来源于stack exchange,提问作者Tomas R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:58:15