Я использую pandas.read_csv
для чтения большого (5 ГБ, ~ 97 миллионов строк X 7 столбцов) txt-файла с python (облако точек).python: Улучшение способа чтения большого (5GB) txt-файла
Мне нужно прочитать первые три столбца (которые представляют координаты x, y, z) и извлечь ограничительную рамку моего облака точек (в форме [x_min, y_min, z_min, x_max, y_max, z_max ]).
Как бы то ни было, мой код (см. Ниже) занимает несколько часов, чтобы закончить (на самом деле это началось вчера, и оно еще не закончилось ...). Аппарат, с которым я работаю, - это процессор Intel Xeon ES-1630 v3 @ 3.70GHz 3.70GHz. Я использую python 3.6 64 бит.
Несколько ключевых моментов моего кода ...
Чтение ту же функцию документации, он читает, что с помощью параметра usecols
* приводит к гораздо быстрее разборе время и низкое потребление памяти *. Поэтому я включил только интересующие меня коллеги.
Я не совсем понимаю о реальной полезности аргумента chunksize
(возможно, я использую его неправильно). Поскольку я использовал его, я полагаю, что он читает файл по строкам, и, возможно, это не лучший подход.
Вот код, любое предложение (также касающееся других подходов, кроме использования pandas.read_csv
) было бы значительно воспринято.
def bounding_box(filename):
startTime = datetime.now() # initialize counter
for row in pd.read_csv(filename, sep='\s+', header=None, chunksize=1, skiprows=1, usecols=[0, 1, 2]):
if not 'x_min' in locals():
x_min = row.iat[0, 0]
if not 'y_min' in locals():
y_min = row.iat[0, 1]
if not 'z_min' in locals():
z_min = row.iat[0, 2]
if not 'x_max' in locals():
x_max = row.iat[0, 0]
if not 'y_max' in locals():
y_max = row.iat[0, 1]
if not 'z_max' in locals():
z_max = row.iat[0, 2]
x_min = row.iat[0, 0] if row.iat[0, 0] < x_min else x_min
y_min = row.iat[0, 1] if row.iat[0, 1] < y_min else y_min
z_min = row.iat[0, 2] if row.iat[0, 2] < z_min else z_min
x_max = row.iat[0, 0] if row.iat[0, 0] > x_max else x_max
y_max = row.iat[0, 1] if row.iat[0, 1] > y_max else y_max
z_max = row.iat[0, 2] if row.iat[0, 2] > z_max else z_max
bbox = [x_min, y_min, z_min, x_max, y_max, z_max]
print("TIME OF PROCESSING: {}".format(datetime.now() - startTime)) # print time of execution
return bbox
Я не уверен, что чтение части CSV, но не было бы лучше, чтобы установить х/г/г мин и макс переменных на значения по умолчанию, может быть 0, до того, как цикл и сэкономить 6 слов «если» и 6 вызовов функций в каждом цикле? – mouckatron
Как написано, вы не можете различать время, потраченное на чтение 'csv', в фреймворк данных и время, затрачиваемое на вычисление поля. Я бы отделил 2 шага и напечатал какой-то оператор, например 'df.info()' между ними. – hpaulj
@ umbe1987 Помимо quesiton, о котором вы просили. Можете ли вы также включить небольшой Dataframe и желаемый результат? – MYGz