我如何知道分块前使用的 csv 文件中的块数(或行数)?
How can I know the amount of chunks (or number of rows) in a csv file using before chunking?
我正在尝试使用 5.000.000 的块大小 pandas 处理 10GB 以上的 csv 文件。从一个块到另一个块处理数据需要一些时间,但我不知道我在文件的哪一部分。在开始循环之前我怎么知道 csv 的块数量(或行数)?选择块大小有什么经验法则吗?
我使用的循环是这样的:
chunk = 5_000_000
data = pd.read_csv(path,chunksize=chunk)
for i in data:
do_some_stuff()
一些想法
- 估计行数before/without读取文件
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
我正在尝试使用 5.000.000 的块大小 pandas 处理 10GB 以上的 csv 文件。从一个块到另一个块处理数据需要一些时间,但我不知道我在文件的哪一部分。在开始循环之前我怎么知道 csv 的块数量(或行数)?选择块大小有什么经验法则吗?
我使用的循环是这样的:
chunk = 5_000_000
data = pd.read_csv(path,chunksize=chunk)
for i in data:
do_some_stuff()
一些想法
- 估计行数before/without读取文件
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