Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在分块之前,如何知道csv文件中的分块量(或行数)?_Python_Pandas_Dataframe_Chunking - Fatal编程技术网

Python 在分块之前,如何知道csv文件中的分块量(或行数)?

Python 在分块之前,如何知道csv文件中的分块量(或行数)?,python,pandas,dataframe,chunking,Python,Pandas,Dataframe,Chunking,我正在尝试使用5.000.000的chunksize处理一个带有pandas的10GB+csv文件。从一个块到另一个块处理数据需要一些时间,但我不知道我在文件的哪个部分。在开始循环之前,我如何知道csv拥有的块数(或行数)?对于选择块大小有什么经验法则吗 我使用的循环是这样的: chunk = 5_000_000 data = pd.read_csv(path,chunksize=chunk) for i in data: do_some_stuff() 一些想法 在读取文件之前

我正在尝试使用5.000.000的chunksize处理一个带有pandas的10GB+csv文件。从一个块到另一个块处理数据需要一些时间,但我不知道我在文件的哪个部分。在开始循环之前,我如何知道csv拥有的块数(或行数)?对于选择块大小有什么经验法则吗

我使用的循环是这样的:

chunk = 5_000_000
data = pd.read_csv(path,chunksize=chunk)

for i in data:
     do_some_stuff()
一些想法

  • 在读取文件之前/不读取文件时估计行数
  • 估计数据帧块的可用内存
  • 使用循环中的信息
import os
import sys

full_size = os.path.getsize('test.csv')  # get size of file
with open('test.csv','rb') as f:
    next(f)                              # skip header
    line_size = len(f.readline())        # get size of one line, assuming 1 byte encoding
linecount = full_size // line_size + 1   # ~count of lines
import psutil

chunksize = (
     psutil.virtual_memory().available 
 // (pd.read_csv('test.csv', nrows=1).memory_usage(deep=True).sum()
     * 4)) # leave memory for computations, here: 1/4 of available memory for the dataframe
chunks = linecount // chunksize
c = pd.read_csv('test.csv', chunksize=chunksize)
for i,df in enumerate(c):
    print(f'working on chunk {i+1} of {chunks}')     # print or log
    df_sum = df.sum().sum()                          # do stuff ...
    print(f'sum in df in chunk {i}: {df_sum}')       # print or log