问题描述
我正在尝试使用5.000.000的块大小使用熊猫处理10GB以上的csv文件。从块到块处理数据需要一些时间,但是我不知道我在文件的哪一部分。我如何在开始循环之前知道csv的块数量(或行数)?选择块大小是否有任何经验法则?
我正在使用的循环是这样的:
chunk = 5_000_000
data = pd.read_csv(path,chunksize=chunk)
for i in data:
do_some_stuff()
解决方法
一些想法
- 估计之前/不读取文件的行数
$csv2 | foreach {
[PSCustomObject]@{
Host = $csv1[$_.vendorid].host
Managed = $_.managed
VendorID = $_.vendorid
Serial = $csv1[$_.vendorid].serial
}
}
Host Managed VendorID Serial
---- ------- -------- ------
A15 Trancom 9001 gtjk123
C15 Stratus 6402 gtjk456
T15 Psycorp 2301 gtjk678
S15 Dell 0101 gtjk103
- 估计数据帧块的可用内存
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