У меня есть несколько больших (30+ миллионов строк) текстовых баз данных, которые я очищаю с помощью следующего кода: мне нужно разбить файл на 1 миллион строк или меньше и сохранить строку заголовка. Я просмотрел chunk и itertools, но не могу найти четкого решения. Он предназначен для использования в модели arcgis.
== обновленный код в соответствии с ответом от icyrock.com
import arcpy, os
#fc = arcpy.GetParameter(0)
#chunk_size = arcpy.GetParameter(1) # number of records in each dataset
fc='input.txt'
Name = fc[:fc.rfind('.')]
fl = Name+'_db.txt'
with open(fc) as f:
lines = f.readlines()
lines[:] = lines[3:]
lines[0] = lines[0].replace('Rx(db)', 'Rx_'+Name)
lines[0] = lines[0].replace('Best Unit', 'Best_Unit')
records = len(lines)
with open(fl, 'w') as f: #where N is the chunk number
f.write('\n'.join(lines))
with open(fl) as file:
lines = file.readlines()
headers = lines[0:1]
rest = lines[1:]
chunk_size = 1000000
def chunks(lst, chunk_size):
for i in xrange(0, len(lst), chunk_size):
yield lst[i:i + chunk_size]
def write_rows(rows, file):
for row in rows:
file.write('%s' % row)
part = 1
for chunk in chunks(rest, chunk_size):
with open(Name+'_%d' % part+'.txt', 'w') as file:
write_rows(headers, file)
write_rows(chunk, file)
part += 1
См. Удаление определенных строк из большого текстового файла в python и разбить большую текстовую (xyz) базу данных на x равных частей для фона. Мне больше не нужно решение на основе cygwin, поскольку оно слишком усложняет модель. Мне нужен питонический способ. Мы можем использовать «записи» для итерации, но неясно, как указать строку 1: 999 999 в db # 1, строки с 1 000 0000 по 1 999 999 в db # 2 и т. д. Это нормально, если последний набор данных имеет менее 1 м записи.
Ошибка с файлом 500mb (у меня 16GB RAM).
Трассировка (последний последний вызов): файл «P:\2012\Job_044_DM_Radio_Propogation\Working\test\clean_file.py», строка 10, in lines = f.readlines() MemoryError
записи 2249878
Приведенное выше количество записей - это не общее количество записей, а просто место, где не хватило памяти (я думаю).
=== С новым кодом от Icyrock.
Чанк работает нормально, но выдает ошибки при использовании в Arcgis.
Время начала: Пт, 09 марта, 17:20:04 2012 ПРЕДУПРЕЖДЕНИЕ 000594: Входной объект 1945882430: выходит за пределы доменов выходной геометрии. ПРЕДУПРЕЖДЕНИЕ 000595: d:\Temp\cb_vhn007_1.txt_Features1.fid содержит полный список функций, которые невозможно скопировать.
Я знаю, что это проблема с фрагментацией, так как процесс «Создать слой событий» отлично работает с полным набором данных до фрагментации.
Любые идеи?