Следуйте за нами и учитесь вместе~
Мы часто сталкиваемся с ситуациями, когда нам необходимо прочитать большие файлы, например, более десяти ГБ, десятки ГБ или даже больше. Если мы читаем их напрямую, память может взорваться и переполниться. Автор недавно столкнулся с ситуацией чтения больших файлов, поэтому хотелось бы поделиться с вами некоторыми способами чтения больших файлов.
Читать построчно и выполнять соответствующие операции построчно.
freader = open(filename, 'rb')
while True:
try:
line = freader.readline()
# do some work
except StopIteration:
break
import pandas as pd
reader = pd.read_csv(filename, iterator=True)
# Каждый раз, когда считывается блок определенного размера, возвращается кадр данных.
data = reader.get_chunk(size)
Измените тип каждого столбца, чтобы уменьшить объем хранилища.
import pandas as pd
reader = pd.read_csv(filename, iterator=True)
data = reader.get_chunk(size)
# downcast используется для изменения типа,
# Ошибки относятся к операции, которую необходимо выполнить, если преобразование невозможно выполнить или возникла ошибка.
# Вы можете использовать повышение (сообщение об ошибках), игнорировать (игнорировать), принуждение преобразуется в NaN
data[column_name1] = pd.to_numeric(data[column_name], downcast='unsigned', errors='coerce')
data[column_name2] = pd.to_numeric(data[column_name], downcast='float', errors='coerce')
data[column_name3] = data[column_name3].astype('category')
reader = pd.read_csv('./cygg/train_data.txt', iterator=True, header=None)
arr = []
for i in range(10):
data = reader.get_chunk(100000)
data.columns = [str(i) for i in range(246)]
arr.append(data)
data = pd.concat(arr)
# Рассчитать размер необработанных данных в ГБ
print(data.memory_usage().sum()/(1024**3))
# Преобразовать int64 метки в int8
data['0'] = pd.to_numeric(data['0'], downcast='unsigned', errors='coerce')
# Рассчитать размер преобразованных данных в ГБ
print(data.memory_usage().sum()/(1024**3))
# Преобразовать float64 в float32
for i in range(6, 246):
data[str(i)] = pd.to_numeric(data[str(i)], downcast='float', errors='coerce')
# Рассчитать конвертированный размер в ГБ
print(data.memory_usage().sum()/(1024**3))
# Преобразование категориальных переменных в тип категории
for i in range(1, 6):
data[str(i)] = data[str(i)].astype('category')
print(data.memory_usage().sum()/(1024**3))
Исходный размер: 1,8328 ГБ, после преобразования в int8: 1,8263 ГБ, после преобразования в float32: 0,9323 ГБ, после преобразования в категорию: 0,9037 ГБ. Можно обнаружить, что после изменения типа потребление памяти значительно снижается.
https://zhuanlan.zhihu.com/p/34420427