奔馳首款純電動汽車將引入中國 最大續航里程200km

根據奔馳的新能源規劃,到2017年底插電式混合動力車將增加至10款,同時包括3款純電動車和1款在燃料電池車。在3款電動車型中,將分別為兩款Smart車型,以及一款B級車。

按照規劃奔馳B級電動車有望在今年內推出,根據官方車型公佈的資料,新車最大續航里程為200公里。

奔馳B級純電動車在海外又叫做B級Electric Drive,目前已在海外上市銷售,外觀造型上與普通版B級基本一致,能突出其純電動版身份的區別是,輪轂上配有藍色飾條,油箱蓋的位置也改為充電插口,並貼有充電標識,另外在尾部也有“ELECTRIC DRIVE”字樣表明其特殊身份。預計新車引入中國後與海外車型相差不大。

據瞭解,奔馳B級電動車的動力總成和電池系統由特斯拉提供,電動機的最大輸出功率為100千瓦,扭矩峰值可達到310牛米。該車的最大續航里程為200千米,使用快充插口可用1小時的充電時間達到100千米的續航里程。引入中國後,這款車的電池系統和動力總成是否進行升級還要繼續跟進消息。

在豪華品牌中寶馬的小型純電動車i3會與新車形成一定競爭,寶馬i3純電動版的電動機最大功率為125千瓦,高出奔馳B級電動車25千瓦;峰值扭矩250牛米,相比較之下i3底出60牛米。另外在電動車中最受關注的續航里程,寶馬i3為160千米,奔馳B級純電動在續航上有一定優勢。

在新能源車領域的規劃中,除了純電動車型,奔馳計畫到2017年共推出10款插電式混動車型,這些插電式混動車型將涵蓋多個車系,包括全新E級、GLC級和GLE級等。另外,奔馳與豐田共同合作研發的首款氫燃料電池車將在明年推出。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

海螺型材欲控股奇瑞新能源汽車

海螺型材日前發佈公告稱,公司將購買奇瑞新能源汽車技術有限公司股權,並取得該公司的控股權。該公告的披露,意味著奇瑞、海螺,這兩家蕪湖本土重量級的企業“航母”之間,將就奇瑞新能源汽車技術有限公司的股權購買,進行重大交易。

2015年底,奇瑞汽車股份有限公司就通過長江產權交易中心,掛牌轉讓旗下控股子公司奇瑞新能源汽車技術有限公司30%的公司股權,對價為 9.22億元。該部分股權被拆分為4個標的,分別包含15%、5%、5%和5%股權。資料顯示,奇瑞新能源註冊資本25億元,目前有3家股東,其中,奇瑞 汽車持有其60%的股權,蕪湖市建設投資有限公司持有30%的股權,蕪湖瑞健投資諮詢有限公司持有10%股權。長江產權交易中心公示顯示,該項股權出讓 “已成交”。

據悉,奇瑞新能源汽車2015年銷售14299輛,同比增長59%;其中奇瑞EQ純電動汽車累計銷售超過8000輛。奇瑞新能源將在無人駕駛領 域發力。今年5月16日,互聯網巨頭百度公司與蕪湖市政府在北京正式簽訂合作協定,宣佈將在蕪湖共同建設全球首個“全無人駕駛汽車運營區域”,百度還將與 奇瑞聯手打造全自動駕駛汽車。奇瑞方面還向外透露,與百度合作開發的無人駕駛電動汽車計畫在今年年底的世界互聯網大會上展示,預計2016年下半年“登陸 資本市場”。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

Python多線程與隊列

Python多線程與Queue隊列多線程在感官上類似於同時執行多個程序,雖然由於GIL的存在,在Python中無法實現線程的真正并行,但是對於某些場景,多線程仍不失為一個有效的處理方法:

1,不緊急的,無需阻塞主線程的任務,此時可以利用多線程在後台慢慢處理;
2,IO密集型操作,比如文件讀寫、用戶輸入和網絡請求等,此時多線程可以近似達到甚至優於多進程的表現;

多線程的基本使用不再贅述,以下語法便可輕鬆實現:

1 def task(args1, args2):
2     pass
3 
4 Thread(
5     target=task,
6     args=(args1, args2)
7 ).start()

這裏我們重點關注線程通信。

假設有這麼一種場景:有一批源數據,指定一個操作係數N,需要分別對其進行與N的加減乘除操作,並將結果匯總。
當然這裏的加減乘除只是一種簡單處理,在實際的生產環境中,它其實代表了一步較為複雜的業務操作,並包含了較多的IO處理。

自然我們想到可以開啟多線程處理,那麼緊接着的問題便是:如何劃分線程,是根據處理步驟劃分,還是根據源數據劃分?

對於前者,我們把涉及的業務操作單獨劃分位一個線程,即有4個線程分別進行加減乘除的操作,顯然上一個線程的結果是下一個線程的輸入,這類似於流水線操作;

而後者則是把源數據分為若干份,每份啟動一個線程進行處理,最終把結果匯總。一般來說,我們推薦第一種方式。因為在一個線程中完成所有的操作不如每步一個線程清晰明了,

尤其是在一些複雜的場景下,會加大單個線程的出錯概率和測試難度。

那麼我們將開闢4個線程,分別執行加減乘除操作。最後一個除法線程結束則任務完成:

 

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 from Queue import Queue
 5 from threading import Thread
 6 
 7 
 8 class NumberHandler(object):
 9     def __init__(self, n):
10         self.n = n
11 
12     def add(self, num):
13         return num + self.n
14 
15     def subtract(self, num):
16         return num - self.n
17 
18     def multiply(self, num):
19         return num * self.n * self.n
20 
21     def divide(self, num):
22         return num / self.n
23 
24 
25 class ClosableQueue(Queue):
26     SENTINEL = object()
27 
28     def close(self):
29         self.put(self.SENTINEL)
30 
31     def __iter__(self):
32         while True:
33             item = self.get()
34             try:
35                 if item is self.SENTINEL:
36                     return
37                 yield item
38             finally:
39                 self.task_done()
40 
41 
42 class StoppableWorker(Thread):
43     def __init__(self, func, in_queue, out_queue):
44         super(StoppableWorker, self).__init__()
45         self.in_queue = in_queue
46         self.out_queue = out_queue
47         self.func = func
48 
49     def run(self):
50         for item in self.in_queue:
51             result = self.func(item)
52             self.out_queue.put(result)
53             print self.func
54 
55 
56 if __name__ == '__main__':
57     source_queue = ClosableQueue()
58     add_queue = ClosableQueue()
59     subtract_queue = ClosableQueue()
60     multiply_queue = ClosableQueue()
61     divide_queue = ClosableQueue()
62     result_queue = ClosableQueue()
63 
64     number_handler = NumberHandler(5)
65 
66     threads = [
67         StoppableWorker(number_handler.add, add_queue, subtract_queue),
68         StoppableWorker(number_handler.subtract, subtract_queue, multiply_queue),
69         StoppableWorker(number_handler.multiply, multiply_queue, divide_queue),
70         StoppableWorker(number_handler.divide, divide_queue, result_queue),
71     ]
72 
73     for _thread in threads:
74         _thread.start()
75 
76     for i in range(10):
77         add_queue.put(i)
78 
79     add_queue.close()
80     add_queue.join()
81     print 'add job done...'
82     subtract_queue.close()
83     subtract_queue.join()
84     print 'subtract job done...'
85     multiply_queue.close()
86     multiply_queue.join()
87     print 'multiply job done...'
88     divide_queue.close()
89     divide_queue.join()
90     print 'divide job done...'
91     result_queue.close()
92 
93     print "%s items finished, result: %s" % (result_queue.qsize(), result_queue)
94 
95     for i in result_queue:
96         print i

運行結果:

線程執行日誌:

 

 

 總的結果:

 

 可見線程交叉運行,但是任務卻是順序結束,這符合我們的預期。

值得注意的是,我們在ClosableQueue定義了一個close()方法,通過放入一個特殊的類變量SENTINEL告訴隊列應該關閉。此外,由於直接加減乘除結果不變,因此我特意乘了兩次來便於我們判斷結果。

總結:

1. Queue是一種高效的任務處理方式,它可以把任務處理流程劃分為若干階段,並使用多條python線程來同時執行這些子任務;

2. Queue類具備阻塞式的隊列操作、能夠指定緩衝區尺寸,而且還支 持join方法,這使得開發者可以構建出健壯的流水線。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

2019年11月20日開發手記

兩種運動檢測算法的介紹:

幀差法:

幀差法是目前運動目標檢測中最常用的算法。幀差法依據的原則是:當視頻中存在移動物體的時候,相鄰幀(或相鄰三幀)之間在灰度上會有差別,求取兩幀圖像灰度差的絕對值,則靜止的物體在差值圖像上表現出來全是0,而移動物體特別是移動物體的輪廓處由於存在灰度變化為非0,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。

二維頻域運動目標檢測:

通過對動態圖像的行列分解, 將三維頻域內的運動檢測問題轉化到兩組二維頻域內進行, 從而降低了濾波器設計的難度。給出了一種提取主運動能量的自適應濾波算法, 通過剔除背景和噪聲的頻率成分, 有效地檢測出運動目標。

 

複雜度分析:

針對幀差法進行分析,代碼複雜度主要集中在absdiff與findContours部分,其中absdiff的迭代次數為2*500*500=50000次,時間為88.46ms(取兩百幀計算平均的時間)

 

針對二維頻域運動目標檢測算法,這裡有兩個代碼版本:

針對py-new-fuliye.py,代碼的複雜度主要集中在兩個部分:傅里恭弘=叶 恭弘變換以及遍歷,在py-new-fuliye.py中,共使用了兩次傅里恭弘=叶 恭弘變換與兩次遍歷,遍歷的迭代次數次數為2*50*30=300次,時間為:54.175ms

 

針對pepoplefft.py(改進版)進行分析,使用了兩次傅里恭弘=叶 恭弘變換(一次正一次逆),進行了一次嵌套遍歷,遍歷次數為:50*10=500次,時間為:  ms

 

針對pepoplefft.py進行優化調參:

搜尋噪點:

要找到噪點,就要知道經傅里恭弘=叶 恭弘高通濾波變換后,剩餘的邊緣部分在數組中的表現規律,採用numpy繪圖表示出來:

 

經過閾值去噪后,效果如圖:

 

在隨後的視頻測試中發現其面對複雜環境表現仍不理想,此時考慮選擇繪製多個矩形來框選標記多個候選目標,暫時不考慮使用其他的濾波進行去噪,原因為1、會佔用原本就不多的處理時間,2、不認為在經過高通濾波后還未被濾掉的噪點會被其他濾波函數濾掉,目標被濾掉的可能性反而更大。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

java property 配置文件管理工具框架,避免寫入 property 亂序

property

是 java 實現的 property 框架。

特點

  • 優雅地進行屬性文件的讀取和更新

  • 寫入屬性文件后屬性不亂序

  • 靈活定義編碼信息

  • 使用 OO 的方式操作 property 文件

  • 支持多級對象引用

變更日誌

快速開始

環境依賴

Maven 3.x

Jdk 1.7+

Maven 引入依賴

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>property</artifactId>
    <version>0.0.4</version>
</dependency>

入門案例

讀取屬性

PropertyBs.getInstance("read.properties").get("hello");

read.properties 為文件路徑,hello 為存在的屬性值名稱。

讀取屬性指定默認值

final String value = PropertyBs.getInstance("read.properties")
                .getOrDefault("hello2", "default");

read.properties 為文件路徑,hello2 為不存在的屬性值名稱,default 為屬性不存在時返回的默認值。

設置屬性

PropertyBs.getInstance("writeAndFlush.properties").setAndFlush("hello", "world-set");

writeAndFlush.properties 為文件路徑,hello 為需要設置的屬性信息。

引導類方法概覽

序號 方法 說明
1 getInstance(propertyPath) 獲取指定屬性文件路徑的引導類實例
2 charset(charset) 指定文件編碼,默認為 UTF-8
3 get(key) 獲取 key 對應的屬性值
4 getOrDefault(key, defaultValue) 獲取 key 對應的屬性值,不存在則返回 defaultValue
5 set(key, value) 設置值(內存)
6 remove(key) 移除值(內存)
7 flush() 刷新內存變更到當前文件磁盤
9 flush(path) 刷新內存變更到指定文件磁盤
10 set(map) 設置 map 信息到內存
11 set(bean) 設置 bean 對象信息到內存
12 asMap() 返回內存中屬性信息,作為 Map 返回
13 asBean(bean) 返回內存中屬性信息到 bean 對象中

對象

簡介

我們希望操作 property 可以想操作對象一樣符合 OO 的思想。

設置值

User user = new User();
user.setName("hello");
user.setHobby("hobby");

final long time = 1574147668411L;
user.setBirthday(new Date(time));

PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties")
        .set(user);

Assert.assertEquals("hobby", propertyBs.get("myHobby"));
Assert.assertEquals("1574147668411", propertyBs.get("birthday"));

讀取值

PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties"
        .set("myHobby", "play")
        .set("birthday", "1574147668411");
User user = new User();
propertyBs.asBean(user);
Assert.assertEquals("play", user.getHobby());
Assert.assertEquals(1574147668411L, user.getBirthday().getTime());

對象定義

  • User.java
public class User {

    private String name;

    @PropertyField("myHobby")
    private String hobby;

    @PropertyField(converter = DateValueConverter.class)
    private Date birthday;

}

@PropertyField 註解

序號 屬性 默認值 說明
1 value 當前字段名稱 對應的 property 屬性名稱
2 converter 默認轉換實現 DefaultValueConverter 對當前字段進行屬性的轉換處理

自定義轉換類

  • DateValueConverter.java

這個就是我們針對 Date 類型,自己實現的處理類型。

實現如下:

public class DateValueConverter implements IValueConverter {

    @Override
    public Object fieldValue(String value, IFieldValueContext context) {
        return new Date(Long.parseLong(value));
    }

    @Override
    public String propertyValue(Object value, IPropertyValueContext context) {
        Date date = (Date)value;
        return date.getTime()+"";
    }

}

集合

說明

有時候一個屬性可能是集合或者數組,這裏暫時給出比較簡單的實現。

將字段值直接根據逗號分隔,作為屬性值。

測試案例

UserArrayCollection userArrayCollection = buildUser();
PropertyBs propertyBs = PropertyBs.getInstance("setBeanArrayCollection.properties")
        .set(userArrayCollection);
Assert.assertEquals("array,collection", propertyBs.get("alias"));
Assert.assertEquals("array,collection", propertyBs.get("hobbies"));

對象定義

  • UserArrayCollection.java
public class UserArrayCollection {

    private List<String> alias;

    private String[] hobbies;
}

暫時只支持 String 類型,不想做的過於複雜。

後期將考慮添加各種類型的支持。

多級對象

說明

有時候我們在一個對象中會引用其他對象,比如 對象 a 中包含對象 b。

這裏採用 a.b.c 這種方式作為屬性的 key, 更加符合使用的習慣。

測試案例

設置

Book book = new Book();
book.name("《海底兩萬里》").price("12.34");
UserEntry user = new UserEntry();
user.name("海倫").book(book).age("10");
PropertyBs propertyBs = PropertyBs.getInstance("setBeanEntry.properties")
        .set(user);
Assert.assertEquals("海倫", propertyBs.get("name"));
Assert.assertEquals("10", propertyBs.get("age"));
Assert.assertEquals("《海底兩萬里》", propertyBs.get("book.name"));
Assert.assertEquals("12.34", propertyBs.get("book.price"));

讀取

Map<String, String> map = new HashMap<>();
map.put("name", "海倫");
map.put("age", "10");
map.put("book.name", "《海底兩萬里》");
map.put("book.price", "12.34");
UserEntry userEntry = new UserEntry();
PropertyBs.getInstance("setBeanEntry.properties")
        .set(map)
        .asBean(userEntry);
Assert.assertEquals("UserEntry{name='海倫', age=10, book=Book{name='《海底兩萬里》', price=12.34}}",
        userEntry.toString());

對象定義

  • UserEntry.java
public class UserEntry {

    private String name;

    private String age;

    @PropertyEntry
    private Book book;

}
  • Book.java
public class Book {

    private String name;

    private String price;

}

@PropertyEntry 說明

@PropertyEntry 註解用來標識一個字段是否採用多級對象的方式表示。

這個註解只有一個屬性,就是 value(),可以用來給當前字段指定一個別稱,和 @PropertyField 別稱類似。

後續特性

  • 提供更多內置的類型轉換實現

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

Mysql備份還有這麼多套路,還不了解下?

邏輯備份和物理備份

邏輯備份

邏輯備份用於備份數據庫的結構(CREAET DATABASE、CREATE TABLE)和數據(INSERT),這種備份類型適合數據量小、跨SQL服務器、需要修改數據等場景。如mysqldump命令就是產生一個邏輯備份工具,使用mysqldump輸出的文件包含CREATE TABLEINSERT語句,能夠直接重建表內容和表結構。

使用邏輯備份有以下優勢和劣勢:

優勢
  • 可移植性高,SQL語句可直接適用於其他SQL服務器;
  • 在數據恢復之前可增加、修改數據;
  • 數據恢復粒度小可以是服務器、數據庫、表級別;
  • 使用文本格式,可讀性高;
劣勢
  • 備份時需要訪問mysql服務器,影響其他客戶端;
  • 需要將數據轉換成邏輯格式(SQL,CSV);
  • 如果命令運行在客戶端,mysql服務器還需要將數據發送給客戶端;
  • 因為輸出格式為文本文件,佔用空間較大;

物理備份

物理備份是包括存儲數據庫內容的目錄和文件的副本,這種類型的備份適用於需要在出現問題時快速恢復的大型重要數據庫。

優勢
  • 完整的Mysql文件和目錄備份,只需要複製文件不需要轉換,速度比邏輯備份更快;
  • 除了備份數據,還能備份配置文件和日誌文件;
  • 不需要運行Mysql服務器就可以完成備份;
  • 備份工具簡單使用cp、scp、tar命令即可完成備份;
劣勢
  • 可移植性不高,恢複數據只適用於相同或類似的機器上;
  • 為了保持數據庫文件的一致性,需要停機備份;
  • 恢復粒度不能按表或用戶恢復;

在線備份和離線備份

在線備份需要mysql服務器處理運行狀態,以便備份工具從mysql服務器中獲取數據。離線備份表示mysql服務器處理停止狀態。兩種備份形式也可以稱為“熱備份”和“冷備份“。

在線備份的主要特性

  • 備份不需要停機,對其他客戶端影響較小其他連接能夠正常訪問mysql服務器(依賴操作類型,如讀操作);
  • 備份需要加鎖,以免在備份期間對數據做出修改;

離線備份的主要特性

  • 備份期間服務器不可用;
  • 備份過程更簡單,不會受到客戶端的干擾;

邏輯備份(mysqldump使用)

mysqldump屬於邏輯備份命令,使用mysqldump備份的優勢是它非常方便和靈活,可以直接編輯輸出文件或者使用導入到其他的SQL服務器中去,但是它不能用作備份大量數據的快速解決方案,對於大數據量,即使備份花費的時候可以接受,但是恢複數據也可能會非常緩慢,因為執執行SQL語句會涉及磁盤I/O進行插入,創建索引等。mysqldump的使用方式非常簡單:

shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases

使用mysqldump備份時要注意:數據庫的一致狀態,在執行mysqldump命令時要保證數據不會再發生變更,保持數據的一致性有二種方法:

  • 使Mysql服務器只讀
  • 使用事務加上隔離級別:REPEATABLE READ

使用REPEATABLE READ事務隔離級別執行mysqldump命令(使用事務保持數據庫的一致狀態):

mysqldump --master-data=2 \
 --flush-logs  \
 --single-transaction  \
 --all-databases > /backup/`date +%F-%H`-mysql-all.sql  

備份參數說明:

  • –master-data: 將二進制日誌文件的名稱和位置備份
  • –flush-logs: 開始備份之前刷新mysql服務器日誌文件
  • –single-transaction:開始備份之前設置事務隔離級別為REPEATABLE READ然後發送一個START TRANSACTION命令。
  • –all-databases:備份所有數據庫

物理備份(複製原始文件)

為了保證複製文件的完整性,備份原始文件最好是停止mysql服務器,複製原始文件備份由以下步驟完成:

  1. 停止mysql服務器
    $ mysqladmin shutdown
  2. 使用合適的工具複製原始數據文件
    $ tar cf /tmp/dbbackup.tar ./data
  3. 備份完成后,運行mysql服務器
    $ mysqld_safe

使用主從備份模式

使用mysqldumptar備份或多或少都會對業務產生影響,使用mysqldump備份需要對數據加鎖,加鎖就意味着其他客戶端操作受到限制。使用tar命令需要停止服務器直接導致數據庫服務器不可用,有沒有辦法能解決這兩種問題呢?答案是有的,就是使用主從備份模式。

在單機的基礎上增加一台Slave機器對Master機器的數據進行同步:

開始備份時對Slave進行備份,這樣即使Slave停機或對數據加鎖也不會影響業務的正常使用,如果公司有條件或業務非常重要可以選擇這種方案來備份數據。

歡迎關注微信公眾號《架構文摘》,高質量技術文章第一時間推送。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

EFCore批量操作,你真的清楚嗎

背景

EntityFramework Core有許多新的特性,其中一個重要特性便是批量操作。

批量操作意味着不需要為每次Insert/Update/Delete操作發送單獨的命令,而是在一次SQL請求中發送批量組合指令。

EFCore批量操作實踐

批處理是期待已久的功能,社區多次提出要求。現在EFCore支持開箱即用確實很棒,可以提高應用程序的性能和速度。

P1 對比實踐

下面以常見的批量插入為例,使用SQL Server Profiler 觀察實際產生並執行的SQL語句。

 還有一種關注EFCore產生的sql語句的方式,添加Nlog支持,關注Microsoft.EntityFrameworkCore.Database.Command 日誌

<logger name=”Microsoft.EntityFrameworkCore.Database.Command” minlevel=”Debug” writeTo=”sql” />

定義插入模型Category, 插入4個實體,這裏為什麼強調4,請留意下文。

    public class Category
    {
        public int Id { get; set; }
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }

/*EFCore 查看模型屬性,有Id使用id作為主鍵,
沒有Id,搜索public "{TableName}Id"作為主鍵,默認為int形主鍵設置標記列自增;
*/ info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [Categories] (
          [Id] int NOT NULL IDENTITY,
          [CategoryID] int NOT NULL,
          [CategoryName] nvarchar(max) NULL,
          CONSTRAINT [PK_Categories] PRIMARY KEY ([Id])
      );

using (var db = new BloggingContext())
{
  db.Categories.Add(new Category() { CategoryID = 1, CategoryName = “Clothing” });
  db.Categories.Add(new Category() { CategoryID = 2, CategoryName = “Footwear” });
  db.Categories.Add(new Category() { CategoryID = 3, CategoryName = “Accessories” });
  db.Categories.Add(new Category() { CategoryID = 4, CategoryName = “Accessories” });
  db.SaveChanges();
} 

當執行SaveChanges(), 日誌显示:

info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[@p0='1', @p1='Clothing' (Size = 4000), @p2='2', @p3='Footwear' (Size = 4000), @p4='3', @p5='Accessories' (Size = 4000), @p6='4', @p7='Accessories' (Size = 4000)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
      MERGE [Categories] USING (
      VALUES (@p0, @p1, 0),
      (@p2, @p3, 1),
      (@p4, @p5, 2),
      (@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
      WHEN NOT MATCHED THEN
      INSERT ([CategoryID], [CategoryName])
      VALUES (i.[CategoryID], i.[CategoryName])
      OUTPUT INSERTED.[Id], i._Position
      INTO @inserted0;

      SELECT [t].[Id] FROM [Categories] t
      INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
      ORDER BY [i].[_Position];

從SQL Profiler追溯到的SQL:

exec sp_executesql N’SET NOCOUNT ON;
DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
MERGE [Categories] USING (
VALUES (@p0, @p1, 0),
(@p2, @p3, 1),
(@p4, @p5, 2),
(@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
WHEN NOT MATCHED THEN
INSERT ([CategoryID], [CategoryName])
VALUES (i.[CategoryID], i.[CategoryName])
OUTPUT INSERTED.[Id], i._Position
INTO @inserted0;

SELECT [t].[Id] FROM [Categories] t
INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
ORDER BY [i].[_Position];

‘,N’@p0 int,@p1 nvarchar(4000),@p2 int,@p3 nvarchar(4000),@p4 int,@p5 nvarchar(4000),@p6 int,@p7 nvarchar(4000)’,@p0=1,@p1=N’Clothing’,@p2=2,@p3=N’Footwear’,@p4=3,@p5=N’Accessories’,@p6=4,@p7=N’Accessories’

 如你所見,批量插入沒有產生4個獨立的語句,而是被組合為一個傳參存儲過程腳本(用列值作為參數);如果使用EF6執行相同的代碼,則在SQL Server Profiler中將看到4個獨立的插入語句 。

① 就性能和速度而言,EFCore批量插入更具優勢。 ② 若數據庫是針對雲部署,EF6運行這些查詢,還將產生額外的流量成本。

 經過驗證:EFCore批量更新、批量刪除功能,EFCore均發出了使用sp_executesql存儲過程+批量參數構建的SQL腳本。

 P2 深入分析

起關鍵作用的 sp_executesql存儲過程: 可以多次執行的語句或批處理 (可帶參)

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]  

注意官方限制: 

The amount of data that can be passed by using this method is limited by the number of parameters allowed. SQL Server procedures can have, at most, 2100 parameters. Server-side logic is required to assemble these individual values into a table variable or a temporary table for processing.       // SQL存儲過程最多可使用2100個參數

P3 豁然開朗

SqlServer  sp_executesql存儲過程最多支持2100個批量操作形成的列值參數,所以遇到很大數量的批量操作,EFCore SqlProvider會幫我們將批量操作分塊傳輸, 

實際上EFCore 對於少於4個的批量命令,不會使用sp_executesql 存儲過程,我這邊自己根據官方驗證確實如此:

估摸着EFCore使用sp_executesql 也是有點耗資源的,對於小批量(小於4條的批量操作)依舊是產生單條sql。

// 同時EFCore開放了【配置關係型數據庫批量操作大小】
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder) { string sConnString
= @"Server=localhost;Database=EFSampleDB;Trusted_Connection=true;"; optionbuilder.UseSqlServer(sConnString , b => b.MaxBatchSize(1)); // 批量操作的SQL語句數量,也可設定為1禁用批量插入 }

總結

① EFCore 相比EF6,已經支持批量操作,能有效提高應用程序的性能

② EFCore的批量操作能力,由對應的DataBaseProvider支撐(Provider實現過程跟背後的存儲載體密切相關)

      –  對於小批量操作(當前EFCore默認MinBatchSize為4》),EFCore不會啟用sp_executesql

  - 大批量關注存儲過程sp_executesql ,存儲過程的列值參數最多2100 個,這個關鍵因素決定了在大批量操作的時候 依舊會被分塊傳輸。

③ 另外一個批量操作的方法,這裏也點一下:構造Rawsql【EFCore支持Rawsql】。

  sqlite不支持存儲過程,為完成批量插入提高性能,可採用此方案。

var insertStr = new StringBuilder();
insertStr.AppendLine("insert into ProfileUsageCounters (profileid,datetime,quota,usage,natureusage) values");
var txt = insertStr.AppendLine(string.Join(',', usgaeEntities.ToList().Select(x =>
{
       return $"({x.ProfileId},{x.DateTime},{x.Quota},{x.Usage},{x.NatureUsage})";
}).ToArray()));
await _context.Database.ExecuteSqlCommandAsync(txt.ToString());

+

+

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

打破松下壟斷,特斯拉擬向Samsung SDI採購車用電池

美商特斯拉(Tesla)所生產的電動車所使用之車用蓄電池,至目前仍幾乎都由日本松下(Panasonic)供應,幾乎形成壟斷狀況。日媒報導,特斯拉計畫拓展電池採購對象,目前已與韓商Samsung SDI展開最終協調。

《日經中文網》一篇報導指出,特斯拉為供應需求日漸成長的純電動車所需的蓄電池,計畫推行多樣化採購對象,且與Samsung SDI的合作,目前已到了最終階段。據報導,Samsung SDI的純電動車用鋰電池已送至位於美國加州的特斯拉開發基地,但由於數量較大,因此被認為已到了正式採用前的試驗階段,而非產品試驗用品。

松下所供應的電動車用蓄電池在質、量兩方面一直占有市場優勢,因此佔據電動車市場供應的大宗。松下與特斯拉於2015年在美國內華達州展開的Gigafactory建設計畫仍在持續,且有部分產能陸續投產,預計將在今年七月底初步完工。

Gigafactory原先規劃的產能為2020年時50GWh,但由於特斯拉還發表了儲能設備Powerpack 和Powerwall ,且市場對Tesla Model 3的反應熱烈,使特斯拉客戶對鋰電池的需求大增,因此有擴增Gigafactory產量的計畫。

而目前供應純電動車用鋰電池的廠商,除了松下、Samsung SDI之外,另一主要廠商為韓國LG Chem,但供應量不大。

(照片來源:Samsung SDI)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

現代計畫為旗下捷恩斯品牌增添一款豪華純電動車

據路透社報導,韓國現代汽車公司高級副總裁Manfred Fitzgerald稱,公司計畫為旗下捷恩斯品牌增添一款豪華純電動車,擴充該豪華品牌的產品線。

Fitzgerald在釜山車展期間向路透社記者表示,由於捷恩斯對現代來講起著推進作用,而且很顯然,電動車必須佔據著重要地位,因此我們確定將推出豪華純電動車。然而,該副總裁並未透露新車推出時間等詳細資訊。

Fitzgerald認為純電動車將是汽車行業的“未來車型。”2015年11月,現代汽車宣佈將原先的高檔子品牌Genesis設立為獨立的全球豪華品牌,此後為了樹立捷恩斯的形象,該公司先後從賓利挖來後者的設計總監呂克•東克沃爾克(Luc Donckerwolke)、外飾設計師Sangyup Lee和前蘭博基尼設計總監Manfred Fitzgerald。

捷恩斯也被現代賦以眾望,被期望增加消費者對高檔車的需求,並借助更高的價位提升不斷減少的利潤。

呂克•東克沃爾克加盟現代後任職現代設計中心高級副總裁,其表示“捷恩斯現在最主要的目標是提高與其他品牌的辨識度,不與後者有設計上的重合。”

現代在一份聲明中表示,計畫在2017年上半年推出捷恩斯G80中大型車的柴油版。在釜山車展上亮相的汽油版G80是該品牌下的第二款車型,將於7月在韓國上市。捷恩斯旗下第一款車型為G90。

Fitzgerald稱,電動車將為捷恩斯這個新品牌增添更多的推進系統,將説明該品牌在豪華車市場獲得成功。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

電動車需求噴發、2035年將飆16倍

日本市調機構富士經濟(Fuji Keizai)15日公布了油電混和車(HV)/插電式油電混和車(PHEV)/電動車(EV)等次世代車種的市場動向調查報告,現行次世代車種以HV需求最大,預估截至2025年左右為止,HV仍將為次世代車種的主流產品,不過因HV僅部分日系車廠專注研發,故預估今後其需求增幅恐將趨緩。

另一方面,PHEV、EV在2025年以後的需求增幅將加快,預估2030年左右時,HV、PHEV、EV將呈現幾乎相互抗衡的局面,2035年在北美、歐洲、中國需求加持下,PHEV、EV市場將進一步擴大,超越HV。

富士經濟指出,2015年特斯拉(Tesla)「Model S」在北美、歐洲、中國市場需求強勁,加上中國車廠在獲得政府豐厚補助政策加持下、於中國國內的銷售走揚,帶動EV全球市場規模大幅增加至34萬台(其中歐洲10萬台、中國15萬台)。

富士經濟指出,全球EV市場當前將持續呈現緩和增長,不過預估自2020年左右起,EV需求將呈現急速擴大,預估2035年全球EV市場規模將達567萬台、將較2015年飆增近16倍(成長1,567%);其中,中國市場規模預估達203萬台(為2015年的13.5倍)、歐洲預估為149萬台(2015年的14.9倍)。

富士經濟並預估,2035年全球PHEV市場規模將達665萬台、將較2015年(21萬台)飆增近31倍(成長3,066%),其中歐洲市場規模預估達217萬台(為2015年的24.1倍)、北美市場為182萬台(2015年的36.4倍)。

2035年全球HV市場規模預估為468萬台、將較2015年(159萬台)成長近2倍(成長194%);其中日本市場規模預估達200萬台(2015年的2.3倍)、北美為135萬台(2015年的3.5倍)。

CNBC報導,著有「Clean Disruption of Energy and Transportation」(暫譯:能源和運輸業的綠化革命)一書的創業家Tony Seba 14日在野村證券舉辦的投資論壇上表示,電動車的運輸效能不斷改善,售價更是快速下降,預估以汽柴油做為動力的內燃式引擎(Internal combustion engine)很快就會失去競爭優勢。

Seba預估,到了2020年,美國一台電動車的售價大約會下降至3萬美元,相較之下,目前一台內燃式引擎新車平均售價還多達33,000美元。不僅如此,到了2022年,一台低階電動車的售價甚至有機會下殺到22,000美元。

日經新聞1月12日報導,日本汽車業龍頭豐田汽車社長豐田章男接受日經/金融時報聯訪時表示,「今後100年將是環保車的時代」,他說,「汽車產業過去1個世紀來,主要以汽油引擎為主流,不過下一個100年,燃料電池車(FCV)、插電式油電混合車(PHEV)等各種環保車需求將增長」。

(本文內容由授權使用;首圖來源: CC BY 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?