Как эффективно читать данные из большого файла Excel, выполнять вычисления и затем сохранять результаты обратно в python? - PullRequest
0 голосов
/ 25 апреля 2019

Допустим, у меня есть файл Excel с 100k строк. Мой код пытается читать его строка за строкой, и для каждой строки выполнять вычисления (включая оценку того, сколько времени требуется для выполнения каждой строки). Затем мой код выдаст массив результатов со 100 тыс. Строк. Я сделал свой код на Python, но он неэффективен и занимает у меня несколько дней, а также результаты тестов ухудшаются из-за большого потребления памяти, я думаю. Пожалуйста, посмотрите мою попытку и дайте мне знать, как ее улучшить.

Мой код сохраняет результаты = [] и записывает его только в конце. Кроме того, в начале я сохраняю весь файл excel в листе ... Я думаю, что это вызовет проблему с памятью, так как в моем приложении Excel очень большой текст в ячейках (не только числа).

ExcelFileName = 'Data.xlsx'
workbook = xlrd.open_workbook(ExcelFileName)
worksheet = workbook.sheet_by_name("Sheet1") # We need to read the data

num_rows = worksheet.nrows  #Number of Rows
num_cols = worksheet.ncols  #Number of Columns
results=[]

    for curr_row in range(1,num_rows,1):
        row_data = []
        for curr_col in range(0, num_cols, 1):
            data = worksheet.cell_value(curr_row, curr_col) # Read the data in the current cell
            row_data.append(data)

        #### do computation here ####
        ## save results like results+=[]

    ### save results array in dataframe and then print it to excel
    df = pd.DataFrame(results)
    writer = pd.ExcelWriter("XX.xlsx", engine="xlsxwriter")
    df.to_excel(writer, sheet_name= 'results')
    writer.save()

Я хотел бы прочитать первую строку из Excel и сохранить ее в памяти, выполнить вычисления, получить результат и сохранить его в Excel, а затем перейти ко второму ряду без сохранения такой загруженности памяти. При этом у меня не будет массива результатов, содержащего 100 тыс. Строк, так как каждый цикл я его стираю.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Для такого рода операций вам, вероятно, лучше загрузить CSV непосредственно в DataFrame, есть несколько методов для работы с большими файлами в пандах, которые подробно описаны здесь, Как прочитать файл CSV 6 ГБ с пандами . Какой метод вы выберете, будет во многом зависеть от типа вычислений, которые вам нужно сделать, поскольку вы, похоже, обрабатываете по одной строке за раз, вероятно, вам следует использовать чанки.

Pandas имеет много встроенных функций оптимизации для работы с большими наборами данных, поэтому большую часть времени вы будете работать с данными внутри DataFrame или Series с большей производительностью, чем с чистым Python. Для достижения наилучшей производительности рассмотрите векторизацию вашей функции или цикл с использованием метода apply , который позволяет пандам применять функцию ко всем строкам наиболее эффективным способом.

0 голосов
/ 25 апреля 2019

Чтобы решить проблему с загрузкой входного файла в память, я хотел бы использовать генератор .Генератор работает путем итерации по любой итерируемой, но возвращает только следующий элемент вместо всей итерируемой.В вашем случае это вернет только следующую строку из вашего .xlsx файла, вместо того, чтобы хранить весь файл в памяти.

Однако это не решит проблему наличия очень большого массива «результатов».К сожалению, обновление файла .csv или .xlsx в процессе работы займет очень много времени, значительно дольше, чем обновление объекта в памяти.Здесь есть компромисс: вы можете использовать много памяти, обновив массив «результатов» и затем записав все это в файл в конце, или вы можете очень медленно обновить файл в файловой системе с результатами какВы идете за счет гораздо более медленного исполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...