實踐和感悟 - scala向下轉型和減少窮舉

来源:http://www.cnblogs.com/gnool/archive/2016/07/19/5668384.html
-Advertisement-
Play Games

工作中的問題總結: 問題一:scala 之向下轉型 引言:假如在複雜的業務邏輯中,變數的類型不能確認,只能給個介面類型,這樣數據類型推導不會錯誤,但是後面要使用實現類的類型時,你卻發現轉不過來了? 對於這樣的一個問題,scala可以這樣解決: 首先建造一個介面,People: 這樣定義了一個介面,接 ...


工作中的問題總結:

問題一:scala 之向下轉型

引言:假如在複雜的業務邏輯中,變數的類型不能確認,只能給個介面類型,這樣數據類型推導不會錯誤,但是後面要使用實現類的類型時,你卻發現轉不過來了?

對於這樣的一個問題,scala可以這樣解決:

首先建造一個介面,People:

trait People {
  def toData[T](people:People):T
}

這樣定義了一個介面,接著我們實現他的實現類Students和Teacher:

class Students(name: String) extends People {
  var level:String="語文"
  
  override def toData[Students](people: People): Students = {
    people.asInstanceOf[Students]
  }

  def work() {
    println("學習")
  }
}
object Students {
  def apply(name: String): Students = {
    new Students(name)
  }
}
class Teacher(name: String, age: Int) extends People {

  var work: String = "hello"
  override def toData[Teacher](people: People): Teacher = {
    people.asInstanceOf[Teacher]
  }

  def teach() {
    println("teaching")
  }
}
object Teacher {
  def apply(name: String, age: Int): Teacher = {
    new Teacher(name, age)
  }
}

這樣我們的前奏做完了,接下來就測試向下轉型:

object Test {
  def main(args: Array[String]): Unit = {
    val a = ("tom", "1")
    val b = ("jim")
    val people:People = test(a)

    if (people != null) { 
      val peo:Teacher=people.toData[Teacher](people)
      println(peo.work)
      peo.teach()
    }
    
    val peo:People = test(b)

    if (peo != null) { 
      val p:Students=peo.toData[Students](peo)
      println(p.level)
      p.work()
    }

  }

  def test(x: Any): People = {
    val people = x match {
      case (name, age) => Teacher(name.toString(), age.toString().toInt)
      case (name)      => Students(name.toString())
      case _           => null
    }
    people
  }
}

執行結果

hello
teaching
語文
學習

成功轉型,這個解決方法是很有用的,工廠生產有很多模型,數據不一樣,類型就不一樣,但是數據源不確定,所以我們就需要一介面類型,去實現這個介面的子類做為相近數據的類型,這樣自動獲取對應的數據,是不是很方便、很好用。

問題二:spark Streaming連接kafka

引言:在工作中遇到streaming連接kafka時報錯,說找不到topic的末偏移量?

我首先看了看是不是話題沒有創建好,用命令接收數據,能收到,說明集群沒問題。再測,還是偏移量的問題,這我就犯愁,連接我自己的環境,沒問題,這就更蒙了,

第二次嘗試:看API,源碼手動設置偏移量,嘗試一圈之後,問題依然沒有解決。

第三次嘗試:重新搭環境,結果還是不行

最後,思考我的環境和生產環境的唯一區別就是hosts文件,我將本地的hosts文件配的和生產環境一樣,好了。(困擾我兩天的問題啊)

總結,應用程式中最好不要填寫IP,寫映射(而映射和環境必須一致),這個streamingkafkaUtil的類有關。

問題三:生產中減少窮舉

引言:在生產環境下麵對紛繁的業務處理場景,我們知道要處理很多邏輯代碼,其中有個叫枚舉(也稱窮舉),當處理這類事務時,會產生大量的迴圈執行,而迴圈是最耗CPU的,大量的迭代計算,可直接拉低計算速度,怎麼處理這類問題呢?

對於事務的不定項的選擇幾率,都會有一定的規律,比如說事件的概率發生,根據概率論的知識,我們可以去統計窮舉各項的頻率,按其大小依次排列,這樣前面的枚舉項就可消費大部分數據,剩下的低概率枚舉項就會以最小的執行次數執行。

比如說有1000000條數據,枚舉項有50個,假如平均25次能找到匹配項,就需要運行25000000次(2.5*10的7次方)

換種思路:假如第一枚舉項是是30%,2是25%,3是20%這樣前三項就消費750000*3+250000*25=8500000(8.5*10的6次方)

直接降一個數量級的執行次數,當然這些都是假設,是不太準的

但是思路就一樣,就是將發生概率高的事件統計優先處理,這既符合生活規律,又符合事務發展的客觀規律。

應用場景就太多了,例子:

       例子一:話說網路運營商想分析用戶的上網行為分析。他不會將網路上的各種資源都先收集一份,然後再去匹配每個用戶的某時的上網行為 

那樣做機器也會累的。所以先樣本調查,然後分析大部分的用戶行為特征,根據樣本獲取統計資源,然後這樣以最小的資源消費最大的數據,剩下的小概率事件。

      例子二:百度搜索詞條的建立,也會尋找樣本,統計大概率數據精準處理,作為頻繁搜索詞緩存,讓搜索快速而精準,當然那其他的陌生詞條利用機器學再處理。每天計算詞條的權重,這樣以權重排列,這樣就會讓大概率更加大概率,再次節約速度。

      總而言之,事務的發展規律都是一樣的,總會有大概率事件,事物的發展規律都是一樣的。符合二八定律。用做小的資源去解決大量數據。


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

-Advertisement-
Play Games
更多相關文章
  • 1.效果圖 2.創建頁面文件(main.xml) 1 <Spinner 2 android:id="@+id/spinner1" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" /> 5 6 < ...
  • 04
    04 ...
  • 相對佈局由其名稱大致可以猜測其是相對於其他的控制項進行佈局的。因此呢!其屬性也就比較多了,不過基本上都是有跡可循的。下麵就其屬性值的特點可以將一些常用的屬性分為以下三個類別。 1. 屬性值為true或false(相對於父控制項的位置) android:layout_centerHrizontal 水平居 ...
  • 顧名思義,LinearLayout是指將佈局或者是控制項以線性的形式排布到佈局里;當然,此處就涉及到兩個方向的排布,只要將LinearLayout中的android:orientation屬性的屬性值設置為vertical(垂直方向)和horizontal(水平方向)即可。 線性佈局當中的一些常見屬性 ...
  • 狀態欄動畫切換效果 效果 源碼 https://github.com/YouXianMing/iOS-Project-Examples 中的 StatusBarAnimation ...
  • 1、UIApplication(應用程式實例) 獲取方式:[UIApplication sharedApplication] 詳細:http://www.cnblogs.com/hissia/p/5678518.html 2、NSNotificationCenter(消息中心) 獲取方式:[NSNo ...
  • user_tab_columns來源於user_tab_cols,user_tab_cols where hidden_column='NO',引自:http://blog.csdn.net/gumengkai/article/details/50823140 user_all_tables 是 u ...
  • 我執行下邊的sql語句 得到下麵結果 誰能告訴我那一步沒有去重嗎? ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...