这段代码遍历指定路径下的所有子目录时,因为文件夹中有数量庞大的文件,导致内存被100%占用,如何解决
时间: 2024-12-15 16:23:24 浏览: 6
如果代码由于大量文件而消耗了全部内存,可以考虑采用以下策略来优化:
1. **流式处理** (Streaming): 使用 `os.scandir()` 而不是 `os.walk()` 来迭代文件和目录,因为它一次只加载一个条目,而不是一次性加载整个目录树。这样可以避免一次性加载过多的数据到内存中。
```python
from pathlib import Path
with Path(folder_path).glob('**/*') as it:
for entry in it:
# 检查是否是需要的 .pdf 文件并处理
```
2. **分批操作** (Batching): 可以将文件分成小批次处理,比如每次处理一定数量的文件,或者在达到某个内存阈值时暂停处理然后释放内存。
```python
batch_size = 100 # 或者其他合适的大小
total_files = 0
for root, dirs, files in os.walk(folder_path):
for file in files:
# ... 处理文件 ...
total_files += 1
if total_files % batch_size == 0 or total_files == len(files): # 达到批量或最后一个文件
# 清理内存并继续处理下一个批量
```
3. **使用生成器表达式** (Generator Expressions): 类似于上面的分批处理,通过生成器可以按需产生数据,而不是一次性存储在内存中。
```python
pdf_files_gen = (file for root, dirs, files in os.walk(folder_path) for file in files if file.endswith('.pdf'))
for pdf_file in pdf_files_gen:
# 处理 .pdf 文件...
```
4. **利用硬盘空间临时存储**: 如果文件非常大并且内存不足以容纳所有文件,可以在读取文件时将其直接写入磁盘(例如,使用 `with open(..., 'wb') as dest:` 直接写入目标位置,而不是先复制到内存中再写入)。
通过以上方法,可以减少内存的消耗,使得代码能够处理大规模文件而不会导致内存溢出。
阅读全文