当前位置: 首页 > 知识库问答 >
问题:

6.5 GB文件上的Pandas read_csv消耗超过170GB的RAM

白腾
2023-03-14

我想提出来,只是因为这太奇怪了。也许韦斯有一些想法。该文件非常规则:1100行x~3M列,数据以制表符分隔,仅由整数0、1和2组成。显然这不是预期的。

如果我如下所示预填充数据帧,它会消耗大约26GB的RAM。

h = open("ms.txt")
header = h.readline().split("\t")
h.close()
rows=1100
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

系统信息:

  • python 2.7.9
  • ipython 2.3.1
  • numpy 1.9.1
  • 熊猫0.15.2

欢迎任何想法。

共有2个答案

赖渊
2023-03-14

我今天在处理3 GB数据时遇到了类似的问题,我只是对我的编码风格做了一点点改变,比如我在代码下面使用了file.read()和file.readline()方法,代码下面一次只在ram中加载一行

import re

df_list = []

with open("ms.txt", 'r') as f:
    for line in f:
        #process(line)
        line = line.strip()
        columns = re.split("\t", line, maxsplit=4) # you should modify these according to your split criteria
        df_list.append(columns)

下面是将数据转换为pandas数据帧的代码。

import pandas as pd
df = pd.DataFrame(df_list)# here you will have to modify according to your data frame needs
农星华
2023-03-14

在小规模上尝试您的代码,我注意到即使您设置了dtype=int,您实际上最终在生成的数据框中使用dtype=object

header = ['a','b','c']
rows = 11
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

df.dtypes
a    object
b    object
c    object
dtype: object

这是因为即使您为pd.read_csv函数提供了列为 dtype=int指令,它也无法覆盖最终由列中的数据确定的 dtype。

这是因为熊猫与numpy和numpy dtypes紧密耦合。

问题是,在您创建的数据帧中没有数据,因此numpy默认数据为< code>np。NaN,它不适合整数。

这意味着numpy会混淆并默认为dtype是对象

与将dtype设置为integer或float相比,将dtype设置为< code>object意味着内存消耗和分配时间方面的开销很大。

df = pd.DataFrame(columns=header, index=range(rows), dtype=float)

这很好,因为<code>是np。NaN可以生活在一个浮动中。这产生

a    float64
b    float64
c    float64
dtype: object

并且应该占用更少的内存。

关于dtype: Pandas read_csv low_memory和dtype选项的详细信息,请参见这篇相关的帖子

 类似资料:
  • 我正在将一个10GB的文件加载到内存中,我发现即使去掉任何额外的开销,只将数据存储在一个阵列中,它仍然需要占用53 GB的ram。这对我来说似乎太疯狂了,因为我正在将一些文本数据转换为long,而long占用更少的空间,将其余的转换为char*,char*应该占用与文本文件相同的空间。我试图加载的文件中有大约1.5亿行数据。当我按照下面的方式加载时,有什么原因会占用这么多内存吗? 这里有三个文件,

  • 如果我运行的Kafka集群的分区比我的单个消费者组拥有的消费者还多。对消息的排序或跨分区的消息的按时传递是否有任何保证? 简单示例: 2个分区,1个使用者 生产者通过一个密钥控制分区分配。 消息1进入并转到分区a 消息2进入并转到分区B 消息3进入并转到分区a 我知道消息1将在消息3之前被使用,因为它们在同一个分区中。但是第二条信息呢?是在消息3之前消费还是在消息3之后消费?还是会有变化?它可能在

  • 问题内容: 好的,我在一个空程序上进行了测试,仅运行一会儿(true){}就使我的CPU占用了50%以上的资源。我正在开发一个游戏,它使用while循环作为主循环,并且CPU始终处于100。 我如何才能让Java重复执行某些操作,而又不消耗超过50%的CPU来执行重复操作呢? 问题答案: 添加睡眠以使线程在一段时间内处于空闲状态: 没有睡眠,while循环将消耗所有可用的计算资源。(例如,理论上,

  • 我注意到Spring Boot应用程序不服从通过Xmx选项设置的内存量。例如:java-Xss64m-Xmx64m-jartest.jar 我还在控制台上打印了应用程序在启动时实际使用的内存量,并显示:最大内存:61M 当我在访问任何网页之前打开Windows进程时,它会显示-105M,那么Java怎么能说61M呢? 在访问任何网页后,它从-125M变为-135M。为什么会有这样的增长?它应该给出

  • ActiveMQ中的持久主题(这似乎是JMS本身的一个障碍)似乎是一个订阅服务器上只能有一个使用者活动。 也就是说,在ActiveMQ文档中: 使用唯一的JMS clientID和持久订阅服务器名称创建JMS持久订阅服务器MessageConsumer。为了符合JMS,对于一个JMS clientID,在任何时间点只能有一个JMS连接处于活动状态,对于一个clientID和订阅者名称,只能有一个使