Python 查找Dask数据帧的长度

Python 查找Dask数据帧的长度,python,dask,dask-dataframe,Python,Dask,Dask Dataframe,我试图使用len(dataframe[column])查找dask数据帧的长度,但每次我尝试执行此操作时,都会出现错误: distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting distributed.nanny - WARNING - Restarting worker Traceback (most recent call last): File "C:\Users\thakneh\

我试图使用
len(dataframe[column])
查找dask数据帧的长度,但每次我尝试执行此操作时,都会出现错误:

distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
Traceback (most recent call last):
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\queues.py", line 238, in _feed
    send_bytes(obj)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\connection.py", line 200, in send_bytes
    self._send_bytes(m[offset:offset + size])
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\connection.py", line 280, in _send_bytes
    ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
BrokenPipeError: [WinError 232] The pipe is being closed
distributed.nanny - ERROR - Nanny failed to start process
Traceback (most recent call last):
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\site-packages\distributed\nanny.py", line 575, in start
    await self.process.start()
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\site-packages\distributed\process.py", line 34, in _call_and_set_future
    res = func(*args, **kwargs)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\site-packages\distributed\process.py", line 202, in _start
    process.start()
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\connection.py", line 948, in reduce_pipe_connection
    dh = reduction.DupHandle(conn.fileno(), access)
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\connection.py", line 170, in fileno
    self._check_closed()
  File "C:\Users\thakneh\AppData\Local\Continuum\anaconda3\lib\multiprocessing\connection.py", line 136, in _check_closed
    raise OSError("handle is closed")
OSError: handle is closed
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting

我的dask数据帧有1000万行。有没有办法克服这个错误。

我觉得查找列的长度并不是那么简单,因为Dask可能正在从各种来源构建数据帧-类似于为什么可以在数据帧上获得
.head()
,但需要做些额外的事情
.tail()


由于您使用的是如此大的数据帧,我相信Python会将
len()
中的任何内容加载到内存中

我有两个建议,但我不完全确定它们不会引发相同的异常

使用
管道
让我们看看这是否可行,您可以尝试在列上使用
pipe
,并将
len
传递给它,也许这可以奏效

dataframe[“column”]管道(len)
以下是

分割 我认为这可能会有帮助的一点是,如果您将列划分为块,这可能有助于保持较低的内存使用率,唯一的问题是您必须对这些分区的大小进行一些来宾工作

另一件你必须跟踪的事情是每个分区的长度,这可能有点混乱,我觉得一定有更好的方法来做tbh

length=0
len+=数据帧[“列”]。分区[:10000]
len+=数据帧[“列”]。分区[:20000]
当然,您可以尝试使用循环使代码更简洁

这里的文档可供参考


请让我知道,如果这些工作中有任何问题,我希望我能帮助您。

请提供一个最小的、可复制的示例。考虑到集群上的内存限制,您可能需要为数据帧使用更多的分区。
df.partitions[:20000]
可能没有执行您认为它正在执行的操作。这将返回dask数据帧的前20000个分区。这不是行的长度或数量,也不能添加到整数中。谢谢你,尼克,我不确定这是否是一种方法,我认为管道或dask.delayed可能是获取列长度的唯一方法?“我相信Python会将len()中的任何内容加载到内存中”-不,这通常不是真的