python - 连接镶木地板文件的 Dask 数据帧会导致内存不足
问题描述
我有 1024 个镶木地板文件,每个 1mbin 大小。我正在使用 pythondask
将这些 1024 个文件合并到一个文件中,并且我有很多磁盘空间,但是 ram 是有限的。
有没有使用 python 解决这个问题的有效方法dask
?
import dask.dataframe as dd
def generatePath():
for i in range(0,1024):
return "data/2000-" + i +".parquet"
def readDF():
paths = generatePath()
for x in paths:
df = dd.read_parquet(x, columns=['name', 'address'], engine='pyarrow')
yield df
def mergeDF():
allDF = readDF()
df = next(allDF)
for iter_DF in allDF:
df = dd.concat([df,iter_DF])
return df.compute()
这是我的代码,它会抛出内存错误。如果我在引擎盖下错了,请纠正我。该代码正在逐个文件加载并创建每个 DF,然后进行连接。在这种情况下,它不需要很多内存吗?
有没有其他方法可以解决?
解决方案
更新的答案
要读取多个文件并将其组合成一个文件.parquet
,请尝试.repartition(1)
- 请参阅此SO 帖子
# Read all files in `data/`
df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')
# Export to single `.parquet` file
df.repartition(npartitions=1).to_parquet("data/combined", write_metadata_file=False)
这会将所有文件data/
合并到一个文件中
$ ls data/combined
part.0.parquet
注意:使用多个 parquet 文件有好处 - 1、2、3、4。
旧答案
不需要计算只是为了读取数据。它会很快填满你的 RAM。这可能会导致您的内存错误。您可以直接使用dd.read_parquet
和指定data/
文件夹
df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')
推荐阅读
- javascript - Canvas 内的 HTML 文本
- css - 为 R markdown ioslides 添加多个 logo;这是与默认 CSS 行一起使用的单个徽标代码
- javascript - 检测浏览器是否本机支持将音频传递给输入标签
- python-3.x - 列表越界
- c++ - 在函数模板中,如何根据另一个参数确定一个参数的类型
- r - 循环以计算R中每个用户在一段时间内的事件
- c - 如何修复完美匹配和不完美匹配功能?
- flutter - 无法使用 ffmpeg 将在线 gif 转换为 mp4 视频
- python - 在 pyautogui 中同时按下键以使它们具有功能?
- php - Laminas\View\Renderer\PhpRenderer::render: 无法渲染模板