python 讀取大文件優化示例

核心方法

  1. 逐行讀取 - 最常用,內存占用O(1)
  2. 分塊讀取 - 適合超大文件,可控制內存使用
  3. 內存映射 - 高性能,虛擬內存映射
  4. 緩沖讀取 - 平衡性能和內存

特殊場景處理

  • CSV文件 - 使用pandas的chunksize參數
  • JSON Lines - 逐行解析JSON對象
  • 文本分析 - 內存高效的單詞計數示例

關鍵優化技巧

  1. 使用生成器 - 避免一次性加載所有數據到內存
  2. 合理設置塊大小 - 平衡內存使用和IO效率
  3. 進度監控 - 實時顯示處理進度
  4. 錯誤處理 - 處理編碼錯誤、文件不存在等異常

使用建議

  • 小于100MB: 直接讀取到內存
  • 100MB-1GB: 使用逐行讀取或小塊讀取
  • 大于1GB: 使用內存映射或大塊分批處理
  • 結構化數據: 使用pandas的chunksize參數

這些方法可以處理幾GB甚至幾十GB的文件而不會導致內存溢出。根據您的具體需求選擇最適合的方法即可。

示例代碼:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
大文件讀取示例 - 避免內存溢出的多種方法
"""import os
import sys
import mmap
import csv
import json
from typing import Generator, Iterator
import pandas as pdclass LargeFileReader:"""大文件讀取工具類"""def __init__(self, file_path: str, encoding: str = 'utf-8'):self.file_path = file_pathself.encoding = encodingdef get_file_size(self) -> int:"""獲取文件大小(字節)"""return os.path.getsize(self.file_path)def get_file_size_mb(self) -> float:"""獲取文件大小(MB)"""return self.get_file_size() / (1024 * 1024)def method1_line_by_line(file_path: str, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法1: 逐行讀取 - 最常用的方法內存使用量: O(1) - 每次只加載一行適用場景: 文本文件、日志文件"""try:with open(file_path, 'r', encoding=encoding) as file:for line_num, line in enumerate(file, 1):# 處理每一行yield line.strip()  # 去除行尾換行符# 可選:顯示進度if line_num % 10000 == 0:print(f"已處理 {line_num} 行")except FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def method2_chunk_reading(file_path: str, chunk_size: int = 1024*1024, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法2: 按塊讀取 - 適合處理二進制文件或超大文本文件內存使用量: O(chunk_size) - 每次加載指定大小的塊適用場景: 二進制文件、超大文本文件"""try:with open(file_path, 'r', encoding=encoding) as file:while True:chunk = file.read(chunk_size)if not chunk:breakyield chunkexcept FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def method3_mmap_reading(file_path: str, encoding: str = 'utf-8') -> Iterator[str]:"""方法3: 內存映射文件 - 高性能讀取內存使用量: 虛擬內存映射,物理內存按需加載適用場景: 需要隨機訪問的大文件、高性能要求"""try:with open(file_path, 'r', encoding=encoding) as file:with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mmapped_file:# 逐行讀取for line in iter(mmapped_file.readline, b""):yield line.decode(encoding).strip()except FileNotFoundError:print(f"文件未找到: {file_path}")except Exception as e:print(f"內存映射錯誤: {e}")def method4_buffered_reading(file_path: str, buffer_size: int = 8192, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法4: 緩沖區讀取 - 平衡性能和內存使用內存使用量: O(buffer_size)適用場景: 需要自定義緩沖區大小的場景"""try:with open(file_path, 'r', encoding=encoding, buffering=buffer_size) as file:for line in file:yield line.strip()except FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def process_large_csv(file_path: str, chunk_size: int = 10000) -> None:"""處理大型CSV文件的示例使用pandas的chunksize參數分塊讀取"""print(f"開始處理CSV文件: {file_path}")try:# 分塊讀取CSV文件chunk_iter = pd.read_csv(file_path, chunksize=chunk_size)total_rows = 0for chunk_num, chunk in enumerate(chunk_iter, 1):# 處理當前塊print(f"處理第 {chunk_num} 塊,包含 {len(chunk)} 行")# 示例處理:統計每列的基本信息print(f"列名: {list(chunk.columns)}")print(f"數據類型: {chunk.dtypes.to_dict()}")# 這里可以添加你的數據處理邏輯# 例如:數據清洗、計算、轉換等total_rows += len(chunk)# 可選:限制處理的塊數量(用于測試)if chunk_num >= 5:  # 只處理前5塊breakprint(f"總共處理了 {total_rows} 行數據")except FileNotFoundError:print(f"CSV文件未找到: {file_path}")except pd.errors.EmptyDataError:print("CSV文件為空")except Exception as e:print(f"處理CSV文件時出錯: {e}")def process_large_json_lines(file_path: str) -> None:"""處理大型JSON Lines文件 (.jsonl)每行是一個獨立的JSON對象"""print(f"開始處理JSON Lines文件: {file_path}")try:with open(file_path, 'r', encoding='utf-8') as file:for line_num, line in enumerate(file, 1):line = line.strip()if not line:continuetry:# 解析JSON對象json_obj = json.loads(line)# 處理JSON對象# 這里添加你的處理邏輯print(f"第 {line_num} 行: {type(json_obj)} - {len(str(json_obj))} 字符")# 示例:提取特定字段if isinstance(json_obj, dict):keys = list(json_obj.keys())[:5]  # 只顯示前5個鍵print(f"  鍵: {keys}")except json.JSONDecodeError as e:print(f"第 {line_num} 行JSON解析錯誤: {e}")continue# 顯示進度if line_num % 1000 == 0:print(f"已處理 {line_num} 行")# 可選:限制處理行數(用于測試)if line_num >= 10000:breakexcept FileNotFoundError:print(f"JSON Lines文件未找到: {file_path}")def process_with_progress_callback(file_path: str, callback_interval: int = 10000) -> None:"""帶進度回調的文件處理示例"""reader = LargeFileReader(file_path)file_size_mb = reader.get_file_size_mb()print(f"文件大小: {file_size_mb:.2f} MB")print("開始處理文件...")processed_lines = 0for line in method1_line_by_line(file_path):# 處理每一行# 這里添加你的處理邏輯line_length = len(line)processed_lines += 1# 進度回調if processed_lines % callback_interval == 0:print(f"已處理 {processed_lines:,} 行")# 可選:限制處理行數(用于測試)if processed_lines >= 50000:print("達到處理限制,停止處理")breakprint(f"處理完成,總共處理了 {processed_lines:,} 行")def memory_efficient_word_count(file_path: str) -> dict:"""內存高效的單詞計數示例適用于超大文本文件"""word_count = {}print("開始統計單詞頻率...")for line_num, line in enumerate(method1_line_by_line(file_path), 1):# 簡單的單詞分割(可以根據需要改進)words = line.lower().split()for word in words:# 清理單詞(去除標點符號等)clean_word = ''.join(c for c in word if c.isalnum())if clean_word:word_count[clean_word] = word_count.get(clean_word, 0) + 1# 顯示進度if line_num % 10000 == 0:print(f"已處理 {line_num} 行,當前詞匯量: {len(word_count)}")print(f"統計完成,總詞匯量: {len(word_count)}")# 返回前10個最常用的單詞sorted_words = sorted(word_count.items(), key=lambda x: x[1], reverse=True)return dict(sorted_words[:10])def main():"""主函數 - 演示各種大文件讀取方法"""# 注意:請替換為你的實際文件路徑test_file = "large_file.txt"  # 替換為實際的大文件路徑csv_file = "large_data.csv"   # 替換為實際的CSV文件路徑json_file = "large_data.jsonl"  # 替換為實際的JSON Lines文件路徑print("=== 大文件讀取示例 ===\n")# 檢查文件是否存在if not os.path.exists(test_file):print(f"測試文件 {test_file} 不存在")print("請創建一個測試文件或修改文件路徑")return# 創建文件讀取器reader = LargeFileReader(test_file)print(f"文件路徑: {test_file}")print(f"文件大小: {reader.get_file_size_mb():.2f} MB\n")# 示例1: 逐行讀取(推薦用于大多數文本文件)print("=== 方法1: 逐行讀取 ===")line_count = 0for line in method1_line_by_line(test_file):line_count += 1if line_count <= 5:  # 只顯示前5行print(f"第{line_count}行: {line[:50]}...")if line_count >= 10000:  # 限制處理行數breakprint(f"處理了 {line_count} 行\n")# 示例2: 塊讀取print("=== 方法2: 塊讀取 ===")chunk_count = 0for chunk in method2_chunk_reading(test_file, chunk_size=1024):chunk_count += 1if chunk_count <= 3:  # 只顯示前3塊print(f"塊{chunk_count}: {len(chunk)} 字符")if chunk_count >= 10:  # 限制處理塊數breakprint(f"處理了 {chunk_count} 個塊\n")# 示例3: 內存映射print("=== 方法3: 內存映射 ===")mmap_count = 0try:for line in method3_mmap_reading(test_file):mmap_count += 1if mmap_count >= 10000:  # 限制處理行數breakprint(f"使用內存映射處理了 {mmap_count} 行\n")except Exception as e:print(f"內存映射失敗: {e}\n")# 示例4: 帶進度的處理print("=== 方法4: 帶進度回調的處理 ===")process_with_progress_callback(test_file, callback_interval=5000)print()# 示例5: CSV文件處理if os.path.exists(csv_file):print("=== CSV文件處理 ===")process_large_csv(csv_file, chunk_size=1000)print()# 示例6: JSON Lines文件處理if os.path.exists(json_file):print("=== JSON Lines文件處理 ===")process_large_json_lines(json_file)print()# 示例7: 單詞計數print("=== 內存高效單詞計數 ===")try:top_words = memory_efficient_word_count(test_file)print("前10個最常用單詞:")for word, count in top_words.items():print(f"  {word}: {count}")except Exception as e:print(f"單詞統計失敗: {e}")if __name__ == "__main__":main()# 性能優化建議:
"""
1. 選擇合適的方法:- 逐行讀取: 適用于大多數文本文件- 塊讀取: 適用于二進制文件或需要自定義處理塊的場景- 內存映射: 適用于需要隨機訪問或高性能要求的場景- pandas分塊: 適用于結構化數據(CSV)2. 內存優化:- 及時釋放不需要的變量- 使用生成器而不是列表- 避免一次性加載整個文件到內存3. 性能優化:- 合理設置緩沖區大小- 使用適當的編碼- 考慮使用多進程/多線程處理4. 錯誤處理:- 處理文件不存在的情況- 處理編碼錯誤- 處理磁盤空間不足等IO錯誤
"""

Excel大文件讀取方法

1. pandas分塊讀取 (.xlsx, .xls)

  • 適合中等大小的Excel文件
  • 可以處理多個工作表
  • 支持數據類型自動識別

2. openpyxl逐行讀取 (.xlsx) - 推薦

  • 內存效率最高的方法
  • 使用read_only=True模式
  • 真正的逐行處理,內存占用O(1)
  • 適合處理超大Excel文件

3. xlrd處理 (.xls)

  • 專門處理舊版Excel格式
  • 分塊讀取支持
  • 適合Legacy Excel文件

4. pyxlsb處理 (.xlsb)

  • 處理Excel二進制格式
  • 讀取速度快,文件小
  • 需要額外安裝pyxlsb庫

新增功能特點

? 智能文件信息獲取 - 不加載全部數據就能獲取文件結構信息
? 內存使用對比 - 實時監控不同方法的內存消耗
? 批量數據處理 - 支持批次處理和進度監控
? 多格式支持 - 支持.xlsx、.xls、.xlsb三種格式
? 錯誤處理 - 完善的異常處理機制

安裝依賴

bash

pip install pandas openpyxl xlrd pyxlsb psutil

使用建議

  • 小于50MB: 可以使用pandas直接讀取
  • 50MB-500MB: 使用pandas分塊讀取
  • 大于500MB: 推薦使用openpyxl逐行讀取
  • 超大文件: 考慮轉換為CSV或Parquet格式

這套方案可以處理幾GB甚至更大的Excel文件而不會內存溢出,特別是openpyxl的逐行讀取方法,是處理超大Excel文件的最佳選擇!

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
大文件讀取示例 - 避免內存溢出的多種方法
"""import os
import sys
import mmap
import csv
import json
from typing import Generator, Iterator
import pandas as pdclass LargeFileReader:"""大文件讀取工具類"""def __init__(self, file_path: str, encoding: str = 'utf-8'):self.file_path = file_pathself.encoding = encodingdef get_file_size(self) -> int:"""獲取文件大小(字節)"""return os.path.getsize(self.file_path)def get_file_size_mb(self) -> float:"""獲取文件大小(MB)"""return self.get_file_size() / (1024 * 1024)def method1_line_by_line(file_path: str, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法1: 逐行讀取 - 最常用的方法內存使用量: O(1) - 每次只加載一行適用場景: 文本文件、日志文件"""try:with open(file_path, 'r', encoding=encoding) as file:for line_num, line in enumerate(file, 1):# 處理每一行yield line.strip()  # 去除行尾換行符# 可選:顯示進度if line_num % 10000 == 0:print(f"已處理 {line_num} 行")except FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def method2_chunk_reading(file_path: str, chunk_size: int = 1024*1024, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法2: 按塊讀取 - 適合處理二進制文件或超大文本文件內存使用量: O(chunk_size) - 每次加載指定大小的塊適用場景: 二進制文件、超大文本文件"""try:with open(file_path, 'r', encoding=encoding) as file:while True:chunk = file.read(chunk_size)if not chunk:breakyield chunkexcept FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def method3_mmap_reading(file_path: str, encoding: str = 'utf-8') -> Iterator[str]:"""方法3: 內存映射文件 - 高性能讀取內存使用量: 虛擬內存映射,物理內存按需加載適用場景: 需要隨機訪問的大文件、高性能要求"""try:with open(file_path, 'r', encoding=encoding) as file:with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mmapped_file:# 逐行讀取for line in iter(mmapped_file.readline, b""):yield line.decode(encoding).strip()except FileNotFoundError:print(f"文件未找到: {file_path}")except Exception as e:print(f"內存映射錯誤: {e}")def method4_buffered_reading(file_path: str, buffer_size: int = 8192, encoding: str = 'utf-8') -> Generator[str, None, None]:"""方法4: 緩沖區讀取 - 平衡性能和內存使用內存使用量: O(buffer_size)適用場景: 需要自定義緩沖區大小的場景"""try:with open(file_path, 'r', encoding=encoding, buffering=buffer_size) as file:for line in file:yield line.strip()except FileNotFoundError:print(f"文件未找到: {file_path}")except UnicodeDecodeError as e:print(f"編碼錯誤: {e}")def process_large_csv(file_path: str, chunk_size: int = 10000) -> None:"""處理大型CSV文件的示例使用pandas的chunksize參數分塊讀取"""print(f"開始處理CSV文件: {file_path}")try:# 分塊讀取CSV文件chunk_iter = pd.read_csv(file_path, chunksize=chunk_size)total_rows = 0for chunk_num, chunk in enumerate(chunk_iter, 1):# 處理當前塊print(f"處理第 {chunk_num} 塊,包含 {len(chunk)} 行")# 示例處理:統計每列的基本信息print(f"列名: {list(chunk.columns)}")print(f"數據類型: {chunk.dtypes.to_dict()}")# 這里可以添加你的數據處理邏輯# 例如:數據清洗、計算、轉換等total_rows += len(chunk)# 可選:限制處理的塊數量(用于測試)if chunk_num >= 5:  # 只處理前5塊breakprint(f"總共處理了 {total_rows} 行數據")except FileNotFoundError:print(f"CSV文件未找到: {file_path}")except pd.errors.EmptyDataError:print("CSV文件為空")except Exception as e:print(f"處理CSV文件時出錯: {e}")def process_large_json_lines(file_path: str) -> None:"""處理大型JSON Lines文件 (.jsonl)每行是一個獨立的JSON對象"""print(f"開始處理JSON Lines文件: {file_path}")try:with open(file_path, 'r', encoding='utf-8') as file:for line_num, line in enumerate(file, 1):line = line.strip()if not line:continuetry:# 解析JSON對象json_obj = json.loads(line)# 處理JSON對象# 這里添加你的處理邏輯print(f"第 {line_num} 行: {type(json_obj)} - {len(str(json_obj))} 字符")# 示例:提取特定字段if isinstance(json_obj, dict):keys = list(json_obj.keys())[:5]  # 只顯示前5個鍵print(f"  鍵: {keys}")except json.JSONDecodeError as e:print(f"第 {line_num} 行JSON解析錯誤: {e}")continue# 顯示進度if line_num % 1000 == 0:print(f"已處理 {line_num} 行")# 可選:限制處理行數(用于測試)if line_num >= 10000:breakexcept FileNotFoundError:print(f"JSON Lines文件未找到: {file_path}")def process_with_progress_callback(file_path: str, callback_interval: int = 10000) -> None:"""帶進度回調的文件處理示例"""reader = LargeFileReader(file_path)file_size_mb = reader.get_file_size_mb()print(f"文件大小: {file_size_mb:.2f} MB")print("開始處理文件...")processed_lines = 0for line in method1_line_by_line(file_path):# 處理每一行# 這里添加你的處理邏輯line_length = len(line)processed_lines += 1# 進度回調if processed_lines % callback_interval == 0:print(f"已處理 {processed_lines:,} 行")# 可選:限制處理行數(用于測試)if processed_lines >= 50000:print("達到處理限制,停止處理")breakprint(f"處理完成,總共處理了 {processed_lines:,} 行")def memory_efficient_word_count(file_path: str) -> dict:"""內存高效的單詞計數示例適用于超大文本文件"""word_count = {}print("開始統計單詞頻率...")for line_num, line in enumerate(method1_line_by_line(file_path), 1):# 簡單的單詞分割(可以根據需要改進)words = line.lower().split()for word in words:# 清理單詞(去除標點符號等)clean_word = ''.join(c for c in word if c.isalnum())if clean_word:word_count[clean_word] = word_count.get(clean_word, 0) + 1# 顯示進度if line_num % 10000 == 0:print(f"已處理 {line_num} 行,當前詞匯量: {len(word_count)}")print(f"統計完成,總詞匯量: {len(word_count)}")# 返回前10個最常用的單詞sorted_words = sorted(word_count.items(), key=lambda x: x[1], reverse=True)return dict(sorted_words[:10])def main():"""主函數 - 演示各種大文件讀取方法"""# 注意:請替換為你的實際文件路徑test_file = "large_file.txt"  # 替換為實際的大文件路徑csv_file = "large_data.csv"   # 替換為實際的CSV文件路徑json_file = "large_data.jsonl"  # 替換為實際的JSON Lines文件路徑print("=== 大文件讀取示例 ===\n")# 檢查文件是否存在if not os.path.exists(test_file):print(f"測試文件 {test_file} 不存在")print("請創建一個測試文件或修改文件路徑")return# 創建文件讀取器reader = LargeFileReader(test_file)print(f"文件路徑: {test_file}")print(f"文件大小: {reader.get_file_size_mb():.2f} MB\n")# 示例1: 逐行讀取(推薦用于大多數文本文件)print("=== 方法1: 逐行讀取 ===")line_count = 0for line in method1_line_by_line(test_file):line_count += 1if line_count <= 5:  # 只顯示前5行print(f"第{line_count}行: {line[:50]}...")if line_count >= 10000:  # 限制處理行數breakprint(f"處理了 {line_count} 行\n")# 示例2: 塊讀取print("=== 方法2: 塊讀取 ===")chunk_count = 0for chunk in method2_chunk_reading(test_file, chunk_size=1024):chunk_count += 1if chunk_count <= 3:  # 只顯示前3塊print(f"塊{chunk_count}: {len(chunk)} 字符")if chunk_count >= 10:  # 限制處理塊數breakprint(f"處理了 {chunk_count} 個塊\n")# 示例3: 內存映射print("=== 方法3: 內存映射 ===")mmap_count = 0try:for line in method3_mmap_reading(test_file):mmap_count += 1if mmap_count >= 10000:  # 限制處理行數breakprint(f"使用內存映射處理了 {mmap_count} 行\n")except Exception as e:print(f"內存映射失敗: {e}\n")# 示例4: 帶進度的處理print("=== 方法4: 帶進度回調的處理 ===")process_with_progress_callback(test_file, callback_interval=5000)print()# 示例5: CSV文件處理if os.path.exists(csv_file):print("=== CSV文件處理 ===")process_large_csv(csv_file, chunk_size=1000)print()# 示例6: JSON Lines文件處理if os.path.exists(json_file):print("=== JSON Lines文件處理 ===")process_large_json_lines(json_file)print()# 示例7: 單詞計數print("=== 內存高效單詞計數 ===")try:top_words = memory_efficient_word_count(test_file)print("前10個最常用單詞:")for word, count in top_words.items():print(f"  {word}: {count}")except Exception as e:print(f"單詞統計失敗: {e}")if __name__ == "__main__":main()# 性能優化建議:
"""
Excel文件大文件讀取最佳實踐:1. 選擇合適的庫和方法:- openpyxl (read_only=True): 最佳內存效率,支持.xlsx- pandas + chunksize: 易用但內存使用較高- xlrd: 適用于.xls文件- pyxlsb: 適用于.xlsb文件2. Excel特有優化:- 使用read_only=True模式- 設置data_only=True跳過公式計算- 逐行讀取而不是一次性加載整個工作表- 按批次處理數據3. 內存優化策略:- 使用生成器和迭代器- 及時釋放DataFrame和工作簿對象- 避免同時打開多個工作簿- 考慮將數據轉換為更高效的格式(如Parquet)4. 性能建議:- 對于超大Excel文件,考慮先轉換為CSV格式- 使用多進程處理多個工作表- 設置合適的批次大小(1000-10000行)- 在SSD上處理文件以提高IO速度5. 文件格式選擇:- .xlsx: 現代格式,壓縮率高,但讀取較慢- .xls: 舊格式,讀取快但文件大- .xlsb: 二進制格式,讀取快,文件小- .csv: 最快的讀取速度,但丟失Excel特性6. 錯誤處理:- 處理損壞的Excel文件- 處理不同的數據類型和格式- 處理合并單元格- 處理隱藏的行和列安裝所需的依賴:
pip install pandas openpyxl xlrd pyxlsb psutil
"""

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923489.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VBA數據結構深度解析:字典對象與集合對象的性能終極對決

VBA數據結構大揭秘:Dictionary與Collection,誰才是性能王者? 某頭部券商的風控系統曾遭遇"數據黑洞"危機:使用Collection處理10萬條交易記錄時,系統響應時間長達47秒,而改用Dictionary后僅需3.2秒——效率差距達14.7倍!這背后是VBA開發者普遍存在的認知盲區:…

【系統分析師】2025年上半年真題:論文及解題思路

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 試題一:論信息系統運維管理技術與應用 試題二:論軟件系統測試方法及應用 試題三:論信息系統開發方法及應用 試題四:論模型驅動分析方法及應用 試題一:論信息系統運維管理技術與應用 智能運維(AIOps)是以人工智能…

立創·廬山派K230CanMV開發板的進階學習——顏色識別

學習目標&#xff1a;立創廬山派K230CanMV開發板的進階學習——顏色識別學習內容&#xff1a;顏色識別 顏色識別 1. 本節介紹 &#x1f4dd; 學習內容&#xff1a;本節將學習基于顏色閾值的色塊檢測技術&#xff0c;通過定義特定顏色范圍&#xff0c;從攝像頭采集的圖像中識別并…

【實時Linux實戰系列】V4L2 采集零拷貝:DMA-BUF 在低延遲視頻中的應用

在實時視頻處理系統中&#xff0c;視頻幀的高效傳輸和處理是確保系統低延遲和高吞吐量的關鍵。傳統的視頻采集和處理流程中&#xff0c;數據拷貝是一個常見的性能瓶頸&#xff0c;它不僅增加了處理延遲&#xff0c;還可能導致幀間抖動。為了克服這些問題&#xff0c;Linux 提供…

STM32精準控制水流

如何用STM32精準控制水的流量&#xff1f;一、系統組成框圖------------- ------------ ----------- -------------| | | | | | | || 流量傳感器 -----> STM32 ----->| 驅動電路 ----->…

吃透 Vue 樣式穿透:從 scoped 原理到組件庫樣式修改實戰

在 Vue 項目開發中&#xff0c;我們經常會引入 Element Plus、Vant、Ant Design等成熟組件庫來提升開發效率。但即便組件庫提供了基礎樣式配置&#xff0c;實際業務中仍需根據設計需求調整組件內部細節樣式——這時候&#xff0c;「樣式穿透」就成了必須掌握的技能。而要理解樣…

記一次維修網橋經歷

1.前言 前倆天突然下大雨了&#xff0c;大雨過后我也迎來斷網時刻&#xff0c;經過簡單排查發現是網絡的網橋這條線路無法連通。 猜測1 可能是網線損壞&#xff0c;2 網橋損壞 2.拆解 經過測試網線設備后發現是網橋的問題&#xff0c;嘗試reset發現無反應&#xff08;正常情況重…

OceanBase001-入門--里面有的概念不確定文章作為了解使用

目錄資料來源特點支持和不支持的點名詞概念租戶資源池租戶使用資源數據庫表分區示例資料來源 B站視頻 點擊跳轉 特點 分兩個版本 企業版支持Oracle 和MySql 社區版本支持 MySql 這里視頻這么講解的。后續有沒有社區版本什么樣子不知道&#xff0c;請不要噴我 單節點部署 兼…

KITTI數據集

KITTI數據集是由德國卡爾斯魯厄理工學院 Karlsruhe Institute of Technology (KIT) 和美國芝加哥豐田技術研究院 Toyota Technological Institute at Chicago (TTI-C) 于2012年聯合創辦&#xff0c;是目前國際上最為常用的自動駕駛場景下的計算機視覺算法評測數據集之一。該數據…

rk3568移植WebRTC AudioProcessing

前言&#xff1a; 大家好&#xff0c;我是飛一樣的成長&#xff0c;今天這篇文章主要想分享音頻3A的內容。在之前有網友找我怎么移植原生的webrtc到rk3568/rk3588上&#xff0c;當時我自己也沒有移植過&#xff0c;后面折騰了一個禮拜才搞定&#xff0c;當時遇到的最大問題&…

介紹一下 RetNet

RetNet&#xff08;Retention Network&#xff09;是微軟亞洲研究院于 2023 年提出的一種新型序列建模架構&#xff0c;旨在解決 Transformer 架構在長序列處理中存在的計算復雜度高、內存占用大、推理速度慢等核心問題。它通過創新的 “循環注意力機制”&#xff0c;實現了 “…

CANopen - PDO映射

CiA402為什么不放到一個PDO中。而是分成幾個PDO? 簡短答案&#xff1a;裝不下 解耦時序。 PDO負載上限&#xff1a;經典CAN的每個PDO只有8字節。TargetPosition(607A:0032bit) ProfileVelocity(60FF:0032bit) ModesOfOperation(6060:008bit) 共9字節&#xff0c;單個PDO放不…

北理工提出僅依賴機載傳感器針對IAP的控制與狀態估計框架

近日&#xff0c;度量用戶、北京理工大學俞玉樹老師團隊在IEEE RAL&#xff0c;IEEE TRO和IEEE TASE期刊上分別發表論文&#xff0c;研究著力于解決多飛行器集聯平臺&#xff08;Integrated Aerial Platforms, IAPs&#xff09;的相對位姿和全局定位問題&#xff0c;提出IAP的控…

13年測試老鳥,性能測試-618與雙11大促銷壓測(二)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、準備工作 準備…

StreamCap(直播錄制) v1.0.2 綠色版

StreamCap 是一個基于FFmpeg和StreamGet的多平臺直播流錄制客戶端&#xff0c;覆蓋 40 國內外主流直播平臺&#xff0c;支持批量錄制、循環監控、定時監控和自動轉碼等功能。軟件特色 多端支持&#xff1a;支持Windows/MacOS/Web運行。循環監控&#xff1a;實時監控直播間狀態&…

OpenCV:圖像拼接(SIFT 特征匹配 + 透視變換)

目錄 一、核心技術原理與對應 API 解析 1.1 SIFT 特征檢測與描述&#xff08;尺度不變特征提取&#xff09; 1.1.1 灰度圖轉換&#xff1a;cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 1.1.2 SIFT 檢測器初始化&#xff1a;cv2.SIFT_create() 1.1.3 特征點檢測與描述符計算&…

日語學習-日語知識點小記-進階-JLPT-N1階段藍寶書,共120語法(10):91-100語法+考え方13

日語學習-日語知識點小記-進階-JLPT-N1階段藍寶書&#xff0c;共120語法&#xff08;10&#xff09;&#xff1a;91-100語法1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰&#xff08;3&#xff09;高級語法N1語法和難點2、知識點-語法&…

繼承與組合:C++面向對象的核心

C 繼承&#xff1a;從基礎到實戰&#xff0c;徹底搞懂面向對象的 “代碼復用術” 在面向對象編程&#xff08;OOP&#xff09;的世界里&#xff0c;“繼承” 是實現代碼復用的核心機制 —— 就像現實中孩子會繼承父母的特征&#xff0c;C 的子類也能 “繼承” 父類的成員&#…

Matplotlib定制:精解顏色、字體、線型與標記

Matplotlib定制&#xff1a;精解顏色、字體、線型與標記導語 Matplotlib 是 Python 數據可視化領域的基石。雖然它的默認樣式足以滿足快速分析的需求&#xff0c;但要創作出具有專業水準、信息清晰、視覺美觀的圖表&#xff0c;就必須掌握其強大的定制功能。本文將深入探討 Mat…

Qt開發經驗 --- Qt監聽文件/文件夾改變(17)

文章目錄[toc]1 概述2 演示效果3 簡單使用示例4 帶界面的使用示例5 源代碼地址更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發經驗 &#x1f448;1 概述 QT實現實時監控文件的創建、修改、刪除操作 跟蹤文件夾內容的增刪改變化 可用于文件發生變化時自…