flush it! 關於數據緩衝區

来源:http://www.cnblogs.com/shencc3/archive/2017/11/13/7827709.html
-Advertisement-
Play Games

之前對python的標準輸入輸出關註不多,所以在碰到flush的時候有了諸多疑惑。 本文記錄了和flush方法相關的緩衝的相關內容,供學習參考。 數據緩衝 在電腦科學中,數據緩衝(data buffer)是一個當數據需要從一個地方移到另一個地方時,用來暫時保存數據的物理區域。常見的情況是,當輸入數 ...


之前對python的標準輸入輸出關註不多,所以在碰到flush的時候有了諸多疑惑。
本文記錄了和flush方法相關的緩衝的相關內容,供學習參考。

數據緩衝

在電腦科學中,數據緩衝(data buffer)是一個當數據需要從一個地方移到另一個地方時,用來暫時保存數據的物理區域。常見的情況是,當輸入數據(例如從麥克風)或者在輸出數據到輸出設備(例如揚聲器)之前,數據會被存儲到buffer中。不過,在電腦程式之間交換數據也會使用到buffer。可以將其與電信通信中的buffer進行對比。緩衝可以通過硬體中固定的存儲位置實現,也可以在軟體中利用虛擬的數據緩衝來實現——只要將其指向一個在物理存儲設備上的地址就可以。在所有情況下,存儲在數據緩衝中的數據都存儲在物理存儲介質中。大部分的緩衝應用在軟體中,一般使用RAM來存儲臨時數據,因為它相較硬碟而言有更快的存取速度。緩衝經常用在接收數據和處理數據的速度不一樣的場景,或者接收、處理數據速度可變的場景,例如印表機隊列以及線上視頻流。

為了適應需要考慮時序的場景,緩衝在記憶體中使用了隊列實現(FIFO)的演算法,以一種速率將數據寫入隊列的同時,以另外一種速率讀數據。

應用

緩衝常用來作為IO和硬體間的連接(conjunction),例如硬碟,從網路中發送或者接收數據,或是在揚聲器上播放音頻。這和過山車前排的長隊是一樣的。游客來玩過山車的頻率通常是未知且變化的,但是過山車來了以後能夠承載很大一批游客(load people in bursts)。排隊的區域就像緩衝一樣——給游客們等待過山車的一個臨時的空間。一般而言,緩衝用FIFO的方法實現,然後按照數據輸入的順序對其進行輸出。

緩衝能夠通過允許同步操作增加應用的性能,例如更快速的文件讀寫,而不是在系統對硬體子系統存取數據時形成阻塞等,取而代之的是,操作系統能夠馬上返回正確的介面調用結果,允許應用在內核還在後臺進行磁碟操作的同時繼續工作。

緩衝帶來的益處還包括當應用在讀寫的數據塊大小與硬碟子系統的塊大小不一致時,緩衝可以用來聚集許多的小數據塊的讀寫操作,有時能夠完全避免針對硬碟的存取操作,以此提高執行效率。

Buffer versus cache

高速緩存通常也作為緩衝區,反之亦然。但是,高速緩存運行的前提是相同的數據將被多次讀取、寫入的數據很快就會被讀取,亦或是有很大概率進行多次讀取,或者多次寫入並以此形成一個較大的塊。他們唯一的目的是減少對底層緩存的訪問。緩存通常被設計為一個不可見的抽象層。

“磁碟高速緩存”或“文件高速緩存”保留數據中包含的統計信息,併在回寫模式下,在超時期限內提交數據。緩衝沒有這個用途。

緩衝區主要用於輸入,輸出,有時是臨時的數據存儲,這些數據可以是其他介質之間的路徑,也可以是在順序寫入(或讀取)數據之前以非順序方式修改的數據。

Buffered vs unbuffered IO

只要在繼續之前能確保輸出已被寫入,就可以使用無緩衝的輸出。一個例子是C runtime library中的標準錯誤 - 預設情況下這通常是無緩衝的。由於錯誤不常發生,所以希望立即知道這些錯誤。另一方面,標準輸出被緩衝,因為預設情況下它有更多的數據通過它。

另一個例子是日誌庫。如果你的日誌消息被保存在你的進程中的緩衝區中,並且你的進程轉儲了核心(core dump),那麼輸出很有可能永遠不會被寫入。

另外,這不僅僅是最小化系統調用,還有最小化磁碟I / O。假設一個程式一次讀取一個位元組的文件,使用無緩衝輸入時,不管怎樣都必須讀取整個數據塊(磁碟硬體本身可能有緩衝區,但仍然要用到磁碟控制器,這將比記憶體訪問慢得多)。

而通過緩衝,整個塊被一次性地讀入緩衝區,然後單個位元組從(記憶體中,超級快)緩衝區傳遞給你。
buffers

sys.stdout.flush方法

python的標準輸出是被緩衝的(buffered),意味著在輸出到終端之前,會收集一些數據,寫入標準輸出中。調用sys.stdout.flush()方法會強制地清空buffer,會將buffer中的所有數據輸出到終端中,即便通常情況下會在清空緩衝區之前等待。


本文編譯自wikipedia和stackoverflow,錯誤之處歡迎指正~

參考資料:
Usage of sys.stdout.flush() method
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO
Python StringIO模塊實現在記憶體緩衝區中讀寫數據
記憶體緩衝區解析


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 官方解釋:os: This module provides a portable way of using operating system dependent functionality. 翻譯:提供一種方便的使用操作系統函數的方法。sys:This module provides access ...
  • 7個國家首都與中國的首都連線,線段的交於中國地圖上,記為7個點,這幾個點彼此互不影響,互不重合,按照各自國家所占的貿易比例,同時進行分割地圖。 ...
  • 異常的分類 在使用上 Error不用管他虛擬機錯誤 Exception必須要用catch抓 RuntimeExcption可以處理也可以不用處理 說明 Error:稱為錯誤,由java虛擬機生成並拋出,包括動態連接失敗,虛擬機錯誤,程式對其不做處理。 Exception:所有異常的父類,其子類對應了 ...
  • 初入Python,一開始就被她簡介的語法所吸引,代碼簡潔優雅,之前在C#裡面打開文件寫入文件等操作相比Python複雜多了,而Python打開、修改和保存文件顯得簡單得多。 1、打開文件的例子: 2、利用urllib庫請求頁面進行簡單的翻譯,請求百度翻譯,將要翻譯的內容當做參數傳給百度,然後將結果賦 ...
  • 1、@RequestMapping RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法 都是以該地址作為父路徑,類和方法共同組成的字元串才是一個完整的url. RequestMapping註解有六個屬性,下麵我們把她分成三類進行說明 ...
  • Alt+Enter 自動添加包Ctrl+t SVN更新Ctrl+k SVN提交Ctrl + / 註釋(取消註釋)選擇的行Ctrl+Shift+F 高級查找Ctrl+Enter 補全Shift + Enter 開始新行TAB Shift+TAB 縮進/取消縮進所選擇的行Ctrl + Alt + I 自 ...
  • 程式需求: 流程圖: 好像畫的不咋地 查看代碼: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # File_type:一個登錄介面 # Author:smelond import os username = "smelond"#用戶名 password ...
  • java內部類是從JDK1.1開始出現的,因此,很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫代碼時可能用到的場景不多,用得最多的是在有事件監聽的情況下。所以,這裡將從四個方面做一個簡單的總結: 一.內部類基礎 在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...