diff --git a/CHANGELOG b/CHANGELOG
index dccf218dc980c528800e63ae5e20e524a92d7184..38e440a72cb99556763b3471da8fac8898bc39b7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,6 +11,7 @@ v 8.8.0 (unreleased)
   - Allow "NEWS" and "CHANGES" as alternative names for CHANGELOG. !3768 (Connor Shea)
   - Added button to toggle whitespaces changes on diff view
   - Backport GitLab Enterprise support from EE
+  - Files over 5MB can only be viewed in their raw form, files over 1MB without highlighting !3718
 
 v 8.7.1 (unreleased)
   - Throttle the update of `project.last_activity_at` to 1 minute. !3848
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index a4d7c425d0f359b192bc8e526b957926f2b82d23..474c6f27374e5573147d2931abc4f2e0a4abe71c 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -3,8 +3,8 @@ module BlobHelper
     Gitlab::Highlight.new(blob_name, blob_content, nowrap: nowrap)
   end
 
-  def highlight(blob_name, blob_content, nowrap: false)
-    Gitlab::Highlight.highlight(blob_name, blob_content, nowrap: nowrap)
+  def highlight(blob_name, blob_content, nowrap: false, plain: false)
+    Gitlab::Highlight.highlight(blob_name, blob_content, nowrap: nowrap, plain: plain)
   end
 
   def no_highlight_files
diff --git a/app/models/blob.rb b/app/models/blob.rb
index 72e6c5fa3fd9628dbaf8d027119e78be1c249701..0fea6b7f57699cc2db2f47d736a6531660ff664d 100644
--- a/app/models/blob.rb
+++ b/app/models/blob.rb
@@ -19,6 +19,14 @@ class Blob < SimpleDelegator
     new(blob)
   end
 
+  def no_highlighting?
+    size && size > 1.megabyte
+  end
+
+  def only_display_raw?
+    size && size > 5.megabytes
+  end
+
   def svg?
     text? && language && language.name == 'SVG'
   end
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index b96e39372813baa28c1d68bebb872a14db99791d..0fd080619254fc33a06d04fa88eae6e4dd07f0a3 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -112,6 +112,10 @@ class Snippet < ActiveRecord::Base
     visibility_level
   end
 
+  def no_highlighting?
+    content.lines.count > 1000
+  end
+
   class << self
     # Searches for snippets with a matching title or file name.
     #
diff --git a/app/views/projects/blob/_text.html.haml b/app/views/projects/blob/_text.html.haml
index d09cd73558cb11daf7e6ec1c752201536c274d3f..b1769759dce7a62e1c4368ebe50d2b782a44af8e 100644
--- a/app/views/projects/blob/_text.html.haml
+++ b/app/views/projects/blob/_text.html.haml
@@ -1,10 +1,19 @@
-- blob.load_all_data!(@repository)
-- if markup?(blob.name)
-  .file-content.wiki
-    = render_markup(blob.name, blob.data)
+- if blob.only_display_raw?
+  .file-content.code
+    .nothing-here-block
+      File too large, you can
+      = succeed '.' do
+        = link_to 'view the raw file', namespace_project_raw_path(@project.namespace, @project, @id), target: '_blank'
+
 - else
-  - unless blob.empty?
-    = render 'shared/file_highlight', blob: blob
+  - blob.load_all_data!(@repository)
+
+  - if markup?(blob.name)
+    .file-content.wiki
+      = render_markup(blob.name, blob.data)
   - else
-    .file-content.code
-      .nothing-here-block Empty file
+    - if blob.empty?
+      .file-content.code
+        .nothing-here-block Empty file
+    - else
+      = render 'shared/file_highlight', blob: blob
diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml
index 57856031d6eb8c9fb793759c47ab62093f9fb4a1..37dcf39c062d0621d2444e324e59b19407bb6000 100644
--- a/app/views/shared/_file_highlight.html.haml
+++ b/app/views/shared/_file_highlight.html.haml
@@ -1,12 +1,13 @@
 .file-content.code.js-syntax-highlight
   .line-numbers
     - if blob.data.present?
+      - link_icon = icon('link')
       - blob.data.each_line.each_with_index do |_, index|
         - offset = defined?(first_line_number) ? first_line_number : 1
         - i = index + offset
         -# We're not using `link_to` because it is too slow once we get to thousands of lines.
         %a.diff-line-num{href: "#L#{i}", id: "L#{i}", 'data-line-number' => i}
-          %i.fa.fa-link
+          = link_icon
           = i
   .blob-content{data: {blob_id: blob.id}}
-    = highlight(blob.name, blob.data)
+    = highlight(blob.name, blob.data, plain: blob.no_highlighting?)
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index cac7644232163d4d70033ed2952c2bce3540d9b0..280120b0f9eb04a04aee5b18849a384229009930 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -1,7 +1,8 @@
 module Gitlab
   class Highlight
-    def self.highlight(blob_name, blob_content, nowrap: true)
-      new(blob_name, blob_content, nowrap: nowrap).highlight(blob_content, continue: false)
+    def self.highlight(blob_name, blob_content, nowrap: true, plain: false)
+      new(blob_name, blob_content, nowrap: nowrap).
+        highlight(blob_content, continue: false, plain: plain)
     end
 
     def self.highlight_lines(repository, ref, file_name)
@@ -17,8 +18,12 @@ module Gitlab
       @lexer = Rouge::Lexer.guess(filename: blob_name, source: blob_content).new rescue Rouge::Lexers::PlainText
     end
 
-    def highlight(text, continue: true)
-      @formatter.format(@lexer.lex(text, continue: continue)).html_safe
+    def highlight(text, continue: true, plain: false)
+      if plain
+        @formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe
+      else
+        @formatter.format(@lexer.lex(text, continue: continue)).html_safe
+      end
     rescue
       @formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe
     end