MST
星途 面试题库

面试题:Python大文件内存管理中生成器的深度应用

在Python处理大文件时,生成器是一种有效管理内存的工具。假设你要处理一个非常大的CSV文件,其中每行数据需要进行复杂的计算和转换后存储到数据库中。请详细描述如何使用生成器来实现这一过程,以避免内存溢出,并给出关键代码片段。
30.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 读取CSV文件并使用生成器逐行生成数据
    • 使用csv.reader结合生成器来逐行读取CSV文件,避免一次性将整个文件读入内存。
    • 示例代码如下:
import csv


def read_csv_generator(file_path):
    with open(file_path, 'r', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            yield row


  1. 对每行数据进行复杂计算和转换
    • 定义一个函数来处理这些复杂操作。例如,假设每行数据包含数字,需要将它们平方后求和。
    • 代码如下:
def complex_calculation(row):
    try:
        numbers = [float(num) for num in row]
        result = sum([num ** 2 for num in numbers])
        return result
    except ValueError:
        return None


  1. 将处理后的数据存储到数据库
    • 这里以SQLite数据库为例。使用sqlite3模块,先连接数据库,然后使用executemany方法批量插入数据(也可以逐行插入,但批量插入效率更高)。
    • 完整代码如下:
import csv
import sqlite3


def read_csv_generator(file_path):
    with open(file_path, 'r', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            yield row


def complex_calculation(row):
    try:
        numbers = [float(num) for num in row]
        result = sum([num ** 2 for num in numbers])
        return result
    except ValueError:
        return None


def store_to_db(data_generator):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS results (id INTEGER PRIMARY KEY AUTOINCREMENT, result REAL)')
    data_to_insert = []
    for row in data_generator:
        result = complex_calculation(row)
        if result is not None:
            data_to_insert.append((result,))
        if len(data_to_insert) >= 1000:  # 每1000条数据批量插入
            cursor.executemany('INSERT INTO results (result) VALUES (?)', data_to_insert)
            conn.commit()
            data_to_insert = []
    if data_to_insert:
        cursor.executemany('INSERT INTO results (result) VALUES (?)', data_to_insert)
        conn.commit()
    conn.close()


if __name__ == '__main__':
    file_path = 'large_file.csv'
    csv_generator = read_csv_generator(file_path)
    store_to_db(csv_generator)


在上述代码中:

  • read_csv_generator函数使用生成器逐行读取CSV文件。
  • complex_calculation函数对每行数据进行复杂计算和转换。
  • store_to_db函数将处理后的数据存储到SQLite数据库中,通过批量插入数据来提高效率,同时也能有效避免内存溢出问题。在实际应用中,数据库连接部分可根据具体使用的数据库(如MySQL、PostgreSQL等)进行调整。