Pandas 中的大型持久 DataFrame

2025-02-25 09:07:00
admin
原创
26
摘要:问题描述:作为长期 SAS 用户,我正在探索转换到 python 和 pandas。 pandas.read_csv()然而,今天运行一些测试时,我惊讶地发现,当尝试处理128mb 的 csv 文件时,python 内存不足。该文件有大约 200,000 行和 200 列,其中大部分是数字数据。使用 SAS,...

问题描述:

作为长期 SAS 用户,我正在探索转换到 python 和 pandas。

pandas.read_csv()然而,今天运行一些测试时,我惊讶地发现,当尝试处理128mb 的 csv 文件时,python 内存不足。该文件有大约 200,000 行和 200 列,其中大部分是数字数据。

使用 SAS,我可以将 csv 文件导入 SAS 数据集,它可以和我的硬盘一样大。

有没有类似的东西pandas

我经常处理大型文件,但无法访问分布式计算网络。


解决方案 1:

Wes 当然是对的!我只是想提供一个更完整的示例代码。我遇到了一个 129 Mb 文件同样的问题,解决方法如下:

import pandas as pd
    
# Returns a TextFileReader, which is iterable with chunks of 1000 rows.
csv_iterator = pd.read_csv('large_dataset.csv', iterator=True, chunksize=1000)
# Iterate through the dataframe chunks and print one row/record at a time
for chunk in csv_iterator:
    for index, row in chunk.iterrows():
        print(row)

# df is DataFrame. If errors, use `list(csv_iterator)` instead
df = pd.concat(tp, ignore_index=True)

解决方案 2:

原则上它不应该耗尽内存,但read_csv由于一些复杂的 Python 内部问题(这一点很模糊,但早已为人所知:http://github.com/pydata/pandas/issues/407),目前在处理大文件时存在内存问题。

目前还没有完美的解决方案(这里有一个冗长乏味的解决方案:你可以将文件逐行转录到预分配的 NumPy 数组或内存映射文件中—— np.mmap),但我将在不久的将来研究它。另一个解决方案是将文件分成较小的部分(使用iterator=True, chunksize=1000),然后将其与连接起来pd.concat。当你将整个文本文件一次性拉入内存时,问题就出现了。

解决方案 3:

这是一个较旧的线程,但我只是想在这里转储我的解决方法。我最初尝试了该chunksize参数(即使使用像 10000 这样的非常小的值),但它并没有太大帮助;内存大小仍然存在技术问题(我的 CSV 约为 7.5 Gb)。

现在,我只是以 for 循环方式读取 CSV 文件块并将它们逐步添加到 SQLite 数据库中:

import pandas as pd
import sqlite3
from pandas.io import sql
import subprocess

# In and output file paths
in_csv = '../data/my_large.csv'
out_sqlite = '../data/my.sqlite'

table_name = 'my_table' # name for the SQLite database table
chunksize = 100000 # number of lines to process at each iteration

# columns that should be read from the CSV file
columns = ['molecule_id','charge','db','drugsnow','hba','hbd','loc','nrb','smiles']

# Get number of lines in the CSV file
nlines = subprocess.check_output('wc -l %s' % in_csv, shell=True)
nlines = int(nlines.split()[0]) 

# connect to database
cnx = sqlite3.connect(out_sqlite)

# Iteratively read CSV and dump lines into the SQLite table
for i in range(0, nlines, chunksize):

    df = pd.read_csv(in_csv,  
            header=None,  # no header, define column header manually later
            nrows=chunksize, # number of rows to read at each iteration
            skiprows=i)   # skip rows that were already read

    # columns to read        
    df.columns = columns

    sql.to_sql(df, 
                name=table_name, 
                con=cnx, 
                index=False, # don't use CSV file index
                index_label='molecule_id', # use a unique column from DataFrame as index
                if_exists='append') 
cnx.close()    

解决方案 4:

以下是我的工作流程。

import sqlalchemy as sa
import pandas as pd
import psycopg2

count = 0
con = sa.create_engine('postgresql://postgres:pwd@localhost:00001/r')
#con = sa.create_engine('sqlite:///XXXXX.db') SQLite
chunks = pd.read_csv('..file', chunksize=10000, encoding="ISO-8859-1",
                     sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

根据您的文件大小,最好优化块大小。

 for chunk in chunks:
        chunk.to_sql(name='Table', if_exists='append', con=con)
        count += 1
        print(count)

数据库中有了所有数据后,您就可以从数据库中查询出您需要的数据。

解决方案 5:

如果你想加载巨大的 csv 文件,dask 可能是一个不错的选择。它模仿了 pandas api,所以感觉和 pandas 很相似

链接到 github 上的 dask

解决方案 6:

您可以使用 Pytable 而不是 pandas df。它是为大型数据集设计的,文件格式为 hdf5。因此处理时间相对较快。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用